2011-06-03 110 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; 
    } 
} 

这解决我的问题