2011-06-03 115 views
8

我有一個XML文件,我想將它插入到Datatable中。 XML文件的格式是如下圖所示:將Xml轉換爲DataTable

<userid ID="37729"> 
    <TestId ID="84" TimeRemaining="60" /> 
    <QuestId ID="1"> 
    <Answer1> 
    </Answer1> 
    <Answer2>B</Answer2> 
    <Answer3> 
    </Answer3> 
    <Answer4> 
    </Answer4> 
    </QuestId> 
</userid> 

現在我要插入一個數據表如下圖所示:

Question Id  Answer1  Answer2  Answer3  Answer4 
1     A           D 

2        B    C  

3           C      

任何一個可以幫助我實現這一目標。

+0

請格式化,你需要在數據表中插入數據,正常。這種方式很難理解。 – 2011-06-03 14:28:11

+1

是否有你需要'DataTable'的具體原因?你可以定義一個可序列化的類,並將它反序列化爲一個對象,就像在這種形式中它可能更有用一樣。 – 2011-06-03 14:39:17

+0

@Joe Enos是的,就像@ColinE建議的那樣,你可以使用Linq-to-XML。 – DOK 2011-06-03 14:43:06

回答

14

我會先用你需要的列創建一個DataTable,然後通過Linq-to-XML填充它。

你可以使用一個選擇查詢創建表示每行一個對象,然後用標準方法爲每個項目創建的DataRows ...

class Quest 
{ 
    public string Answer1; 
    public string Answer2; 
    public string Answer3; 
    public string Answer4; 
} 

public static void Main() 
{ 
    var doc = XDocument.Load("filename.xml"); 

    var rows = doc.Descendants("QuestId").Select(el => new Quest 
    { 
     Answer1 = el.Element("Answer1").Value, 
     Answer2 = el.Element("Answer2").Value, 
     Answer3 = el.Element("Answer3").Value, 
     Answer4 = el.Element("Answer4").Value, 
    }); 

    // iterate over the rows and add to DataTable ... 

} 
+0

這將工作肯定。 +1 =) – 2011-06-03 15:01:14

+7

,但我winder爲什麼我''預期''後新'()' – user1590636 2013-03-04 00:15:19

+0

@ user1590636因爲此代碼不編譯。我將所需的信息編輯到答案中。另一個微小的錯誤是重載'XDocument.Load(yourxmlstring)'期望字符串是[文件的Uri](https://msdn.microsoft.com/en-us/library/bb343181(v = vs。 110).aspx),而不是文字XML - 將參數名稱更改爲「filename.xml」。當你需要直接從字符串中加載時,使用一個內存流。 – dlatikay 2018-01-12 10:55:09

2

How To Read XML Data into a DataSet by Using Visual C# .NET包含一些細節。基本上,您可以使用超載的DataSet method ReadXml將數據獲取到DataSet中。您的XML數據將位於第一個DataTable中。

還有一個DataTable.ReadXml method

+0

您確定提供的XML是適用於ReadXml的格式嗎? – ColinE 2011-06-03 14:34:50

+0

@ColinE,不,我不確定,特別是對這個問題的編輯。通過運行代碼很容易找到。如果這種方法有效,它將避免必須創建列和選擇語句。如果數據源可以根據ReadXml方法進行調整,那將節省很多工作量。 – DOK 2011-06-03 14:41:14

9
DataSet ds = new DataSet(); 
ds.ReadXml(fileNamePath); 
+6

您確定提供的XML是適用於ReadXml的格式嗎? – ColinE 2011-06-03 14:35:20

1

您可以使用此代碼(推薦)

MemoryStream objMS = new MemoryStream(); 
DataTable oDT = new DataTable();//Your DataTable which you want to convert 
oDT.WriteXml(objMS); 
objMS.Position = 0; 
XPathDocument result = new XPathDocument(objMS); 

這是另一種方式,但首先是前。推薦

StringWriter objSW = new StringWriter(); 
DataTable oDt = new DataTable();//Your DataTable which you want to convert 
oDt.WriteXml(objSW); 
string result = objSW.ToString(); 
+2

你要插入到DataTable的XML在哪裏?請先閱讀這個問題。 – nZeus 2014-09-04 16:53:13

-2

也許這可能是一個較老的文章。但必要的上述答案不會幫助我,因爲我需要。然後,我爲此寫了一個小片段。

此接受道上至少3個級別(如本示例)任何XML:

<XmlData> 
    <XmlRow> 
     <XmlField1>Data 1</XmlField1> 
     <XmlField2>Data 2</XmlField2> 
     <XmlField3>Data 3</XmlField3> 
     ....... 
    </XmlRow> 
</XmlData> 

public static class XmlParser 
{ 
    /// <summary> 
    /// Converts XML string to DataTable 
    /// </summary> 
    /// <param name="Name">DataTable name</param> 
    /// <param name="XMLString">XML string</param> 
    /// <returns></returns> 
    public static DataTable BuildDataTableFromXml(string Name, string XMLString) 
    { 
     XmlDocument doc = new XmlDocument(); 
     doc.Load(new StringReader(XMLString)); 
     DataTable Dt = new DataTable(Name); 
     try 
     { 

      XmlNode NodoEstructura = doc.FirstChild.FirstChild; 
      // Table structure (columns definition) 
      foreach (XmlNode columna in NodoEstructura.ChildNodes) 
      { 
       Dt.Columns.Add(columna.Name, typeof(String)); 
      } 

      XmlNode Filas = doc.FirstChild; 
      // Data Rows 
      foreach (XmlNode Fila in Filas.ChildNodes) 
      { 
       List<string> Valores = new List<string>(); 
       foreach (XmlNode Columna in Fila.ChildNodes) 
       { 
        Valores.Add(Columna.InnerText); 
       } 
       Dt.Rows.Add(Valores.ToArray()); 
      } 
     } catch(Exception) 
     { 

     } 

     return Dt; 
    } 
} 

這解決我的問題