簡體   English   中英

C#從LinQ XDocument加載DataTable

[英]C# Load DataTable from LinQ XDocument

我有一個復雜的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;
    }

所以我終於解決了這個問題。 對於閱讀此書的任何人,您都需要解決兩部分,首先將列名放入數據表中,然后再獲取xml值。

對於列名,因為我們已經要上傳到sql中的一個表,我只使用了dataadapter來用架構填充數據表,以確保dt中存在每個列名。

對於xml值,這被證明比較棘手,因為在普通的xml中,我本可以在fieldname =上循環,但是由於每個屬性標簽都不相同,因此我使用.attribute?.value手動提取了每個屬性。 這是創建數據行的簡單情況,如果數據為空,則將其合並為DBNull。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM