【问题标题】:C# Load DataTable from LinQ XDocumentC# 从 LinQ XDocument 加载数据表
【发布时间】:2019-07-23 20:32:22
【问题描述】:

我有一个复杂的 XML,它被加载到 XDocument 中,我想把它变成一个 DataTable。这是实际的 XML:

<?xml version="1.0"?>
<XMLCONTAINER version="1.0" incCount="3">
<APPLICATION id="APPLICATION_NODE_1" title="" name="55038170812RDOpayment" application="Excel" appfile="%SAAR%\xmlsFs\Dbxmls.xla" command="openDatabaseDesigner">
<MAINDATA id="CONTAINER_NODE_2" title=""/>
<SKY.FORM id="CONTAINER_NODE_3" title="" table="tblMain" database="\\c\E\DARA\Data\Link\RDOpayments.mdb">
  <FIELD fieldName="RID">1234567</FIELD>
  <FIELD fieldName="DateTime">05/02/2019 09:00:50</FIELD>
  <FIELD fieldName="DateOfLetter">29/01/2019</FIELD>
  <FIELD fieldName="Name">Mr Joe Bloggs</FIELD>
  <FIELD fieldName="NRID">XXX1234X</FIELD>
  <FIELD fieldName="paymentAmount">776.40</FIELD>
  <FIELD fieldName="Amountfor0809">776.40</FIELD>
  <FIELD fieldName="ACE">FALSE</FIELD>
  <FIELD fieldName="Telephone">123456789</FIELD>
  <FIELD fieldName="AcceptWithheldNumber">FALSE</FIELD>
  <FIELD fieldName="PotentialACECase">FALSE</FIELD>
  <FIELD childID="CONTAINER_NODE_3_field7option1" fieldName="CustomerType">3</FIELD>
  <FIELD fieldName="ContactHistory">05/02/2019</FIELD>
  <FIELD fieldName="ACERed">FALSE</FIELD>
</SKY.FORM>

DataTable 需要如下所示:

RID	DateTime		DateOfLetter	Name		NRID	paymentAmount	ACE
---	-----------		------------	---- 		----	------------- 	----------
1234567	2019-02-05 10:23:51	2019-02-05	MISS LL TEST	X1234X	123.45		FALSE
7654321	2019-01-11 11:11:11	2019-02-03	MR I WONG	Y4321Y	321.21		TRUE

我目前的编码尝试没有将 xml 选为 Node?我觉得应该是属性xattribute??

// Conversion Xml file to DataTable
    public DataTable CreateDataTableXML(string XmlFile)
    {
        XmlDocument doc = new XmlDocument();

        doc.Load(XmlFile);

        DataTable Dt = new DataTable();

        try
        {
            Dt.TableName = GetTableName(XmlFile);
            XmlNode NodeStructure = doc.DocumentElement.ChildNodes.Cast<XmlNode>().ToList()[0];
            progressBar1.Maximum = NodeStructure.ChildNodes.Count;
            progressBar1.Value = 0;
            foreach (XmlNode column in NodeStructure.ChildNodes)
            {
                Dt.Columns.Add(column.Name, typeof(String));
                Progress();
            }

            XmlNode Xnodes = doc.DocumentElement;
            progressBar1.Maximum = Xnodes.ChildNodes.Count;
            progressBar1.Value = 0;
            foreach (XmlNode xnode in Xnodes.ChildNodes)
            {
                List<string> Values = xnode.ChildNodes.Cast<XmlNode>().ToList().Select(x => x.InnerText).ToList();
                Dt.Rows.Add(Values.ToArray());
                Progress();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        return Dt;
    }

【问题讨论】:

    标签: c# xpath datatable namespaces linq-to-xml


    【解决方案1】:

    所以我终于解决了这个问题。对于阅读本文的任何人,您需要分两部分解决,首先将列名放入数据表,然后将 xml 值。

    对于列名,因为我们已经有一个要上传到的 sql 表,我只是使用一个数据适配器来填充数据表,该模式确保每个列名都存在于 dt 中。

    对于 xml 值,这被证明更棘手,因为在普通 xml 中,我可以在 fieldname= 上循环,但是由于每个属性标记不同,我使用 .attribute ?.value 手动提取每个标记。这是一个简单的案例,如果数据为空,创建数据行将合并为 DBNull。

    【讨论】:

      猜你喜欢
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多