将 Xml 转换为数据表

Posted

技术标签:

【中文标题】将 Xml 转换为数据表【英文标题】:Convert Xml to DataTable 【发布时间】:2011-09-07 20:53:34 【问题描述】:

我有一个 XML 文件,我想将它插入到数据表中。 xml文件的格式如下:

<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                     

谁能帮我实现这个目标。

【问题讨论】:

请正确格式化需要插入数据表的数据。这种方式很难理解。 是否有特定原因需要DataTable?您可能可以定义一个可序列化的类并将其反序列化为一个对象,这同样容易,并且在这种形式下它可能会更有用。 @Joe Enos 是的,就像@ColinE 建议的那样,您可以使用 Linq-to-XML。 @Joe:没有任何具体的,只是想以表格格式存储XML文件..如上例。 【参考方案1】:

我将首先使用您需要的列创建一个 DataTable,然后通过 Linq-to-XML 填充它。

您可以使用 Select 查询来创建代表每一行的对象,然后使用标准方法为每个项目创建 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 ...


【讨论】:

但是我想知道为什么我在new()之后得到type expected @user1590636 因为此代码无法编译。我将所需信息编辑到答案中。另一个小错误是重载XDocument.Load(yourxmlstring) 期望字符串是Uri of a file,而不是文字 XML - 将参数名称更改为“filename.xml”。当您需要直接从字符串加载时,请使用内存流。 不知道元素名称怎么办?【参考方案2】:
DataSet ds = new DataSet();
ds.ReadXml(fileNamePath);

【讨论】:

您确定提供的 XML 格式适合 ReadXml 吗?【参考方案3】:

How To Read XML Data into a DataSet by Using Visual C# .NET 包含一些细节。基本上,您可以使用重载的DataSet method ReadXml 将数据放入DataSet。您的 XML 数据将在第一个 DataTable 中。

还有一个DataTable.ReadXml method。

【讨论】:

您确定提供的 XML 格式适合 ReadXml 吗? @ColinE,不,我不确定,尤其是对问题的编辑。通过运行代码很容易找到。如果这种方法有效,它将避免必须创建列和选择语句。如果数据源可以根据 ReadXml 方法进行定制,那将节省大量精力。【参考方案4】:

您可以使用此代码(推荐)

 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);

这是另一种方式,但首先是 ex。推荐

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

【讨论】:

您要插入到 DataTable 的 XML 在哪里?请先阅读问题。【参考方案5】:

也许这可能是一篇较旧的文章。但上述答案中的任何一个都不能帮助我。然后我为此写了一个小sn-p。

这接受具有至少 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;
    

这解决了我的问题

【讨论】:

以上是关于将 Xml 转换为数据表的主要内容,如果未能解决你的问题,请参考以下文章

如何将多行标签xml文件转换为数据框

如何将xml文件转换成excel电子数据表

如何将 XML 转换为具有二进制数据内容的 Json

将 XML 数据转换为 C# 类

这是啥数据格式,如何将其转换为 XML?

将 XML 转换为数据框