将数据集数据表合并到单个数据表c#

时间:2016-01-03 13:39:04

标签: c# datatable dataset

请协助。我正在努力解决这个问题。这是c#数据集的xml输出。它将Quickbooks响应加载到数据集中。为清楚起见,我删除了大量数据和列。

这种层次结构,是(表> row>表)关系。我正试图找到一个数据表。所以table [CustomerRet] + [Adjoining tables]返回一个包含合并列名的数据表。


ListID
COL1
Col2
BillAddress(另一个持有结果的表格)
地址1
ADDR2
山口

现在将返回表结构和行(只需要相邻表的第一行)

  

ListID,Col1,Col2,BillAddressAddr1,BillAddressAddr2,Col6 ......等

<?xml version="1.0" standalone="yes"?>
<QBXML>
  <xs:schema id="QBXML" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="QBXML" msdata:IsDataSet="true" msdata:Locale="en-US">
      <xs:complexType>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element name="QBXMLMsgsRs">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="CustomerQueryRs" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="CustomerRet" minOccurs="0" maxOccurs="unbounded">
                        <xs:complexType>
                          <xs:sequence>
                            <xs:element name="ListID" type="xs:string" minOccurs="0" />
                            <xs:element name="BillAddress" minOccurs="0" maxOccurs="unbounded">
                              <xs:complexType>
                                <xs:sequence>
                                  <xs:element name="Addr1" type="xs:string" minOccurs="0" />
                                  <xs:element name="Addr2" type="xs:string" minOccurs="0" />
                                  <xs:element name="Addr3" type="xs:string" minOccurs="0" />
                                </xs:sequence>
                              </xs:complexType>
                            </xs:element>                            
                          </xs:sequence>
                        </xs:complexType>
                      </xs:element>
                    </xs:sequence>                   
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <QBXMLMsgsRs>
    <CustomerQueryRs statusCode="0" statusSeverity="Info" statusMessage="Status OK">
      <CustomerRet>
        <ListID>20000-1197738925</ListID>
        <BillAddress>
          <Addr1>Cristina Andres</Addr1>
          <Addr2>4242 Cypress Hill Rd</Addr2>
        </BillAddress>
      </CustomerRet>
    </CustomerQueryRs>
  </QBXMLMsgsRs>
</QBXML>

 //something like
                DataTable dtFinal = new DataTable();
                //Load the Qb Dataset    
                DataSet dsQb = new DataSet();
                dsQb.ReadXml(fileName, XmlReadMode.Auto);
                dtFinal = dsQb.Tables[2].Clone();

                foreach(DataRow dr in dsQb.Tables[2].Rows)
                {
                    //Add the missing columns...?

                }
                //Import the rows

任何人都有任何指示?也许linq?

1 个答案:

答案 0 :(得分:0)

当xml子级别的级别变得太大时,DataSet.ReadXml()不能正常工作。试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq; 

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENANE = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENANE);

            var customerQueryRs = doc.Descendants("CustomerQueryRs").Select(x => new {
                statusCode = x.Attribute("statusCode").Value,
                statusSeverity = x.Attribute("statusSeverity").Value,
                statusMessage = x.Attribute("statusMessage").Value,
                listID = x.Descendants("ListID").FirstOrDefault().Value,
                addresses = x.Descendants("BillAddress").FirstOrDefault().Descendants().Select(y => new {
                    address = y.Value
                }).ToList()
            }).ToList();
        }
    }
}
​