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

本文关键字:数据表 单个 合并 数据集 | 更新日期: 2023-09-27 18:28:44

请提供帮助。我有点挣扎。这是c#数据集的xml输出。它是加载到数据集中的Quickbooks响应。为了清晰起见,我删除了大量数据和列。

这种层次关系,是(表>行>表)关系。我正试图找到一个数据表。因此,表[CustomerRet]+[Adjoining-tables]返回一个具有合并列名的单个数据表。

立柱
ListID
第1列
第2列
BillAddress(另一个包含结果的表)
 nbsp Addr1
 nbsp Addr2


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

ListID、第1列、第2列、BillAddressAddr1、BillAddressAddr2、第6列等

<?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

有人有什么线索吗?也许林克?

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

当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();
        }
    }
}
​