【问题标题】:Parsing Multiple Nested XML file to Data table using C#使用 C# 将多个嵌套的 XML 文件解析为数据表
【发布时间】:2018-12-23 11:41:51
【问题描述】:

我正在尝试使用 C# 将嵌套 XML 文件读取到单个数据集,并尝试使用 Linq 和 XDocument,但没有找到任何运气,所以有人可以帮助我解析 XML 文件并提前致谢。

XDocument doc = XDocument.Load(filenamepath);
       XNamespace ns = doc.Root.GetDefaultNamespace();
       DataTable dt = new DataTable();
       dt.Columns.Add("Shipment ID", typeof(string));
       dt.Columns.Add("Delivery Number", typeof(string));

       XElement referenceNumber = doc.Descendants(ns + "ReferenceNumber").FirstOrDefault();
       string shipmentID = (string)referenceNumber.Element(ns + "Shipment ID");
       string deliveryNumber = (string)referenceNumber.Element(ns + "Delivery Number");

【问题讨论】:

  • 您有一个非常复杂的 xml 文件,没有架构。它需要一个自定义解析器!!!使用标准 DataSet ReadXML 文件仅适用于有限数量的后代。数据集方法使用根标签作为数据集名称。下一级标签是数据表名称。第三级标签是列名。第 4 级标签是行数据。一旦您拥有多个或多个级别的标签,dataset 方法会将数据集分成无法重新组合成可用格式的片段。如果您需要解析 xml 的部分,我可以提供帮助,但它会花一整天的时间让我完成整个文件。
  • 这里的预期输出是什么?我只看到两个唯一的货件编号/交货编号,BH30005632 / 0860017651 和 BH30005633 / 0860017652。那么你想要一个包含两行的数据表吗?
  • 我同意这是一个非常复杂的 XML 文件。假设父节点 Shipments & Plan 我需要 2 个数据表,它们将循环通过子节点引用 Numbers ..etc

标签: c# xml-parsing


【解决方案1】:

我使用 xml linq 解析了一些 xml。

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("BOL ID", typeof(string));
            dt.Columns.Add("BOL Type", typeof(string));
            dt.Columns.Add("BOL Created By", typeof(string));
            dt.Columns.Add("BOL Created Date", typeof(DateTime));
            dt.Columns.Add("BOL Updated By", typeof(string));
            dt.Columns.Add("BOL Updated Date", typeof(DateTime));

            dt.Columns.Add("Reference Number Type", typeof(string));
            dt.Columns.Add("Reference Number Primary", typeof(Boolean));
            dt.Columns.Add("Reference Number ID", typeof(string));
            dt.Columns.Add("Reference Number", typeof(string));

            XDocument doc = XDocument.Load(FILENAME);
            XElement root = doc.Root;
            List<XElement> masterBillOfLadings = root.Elements("MasterBillOfLading").ToList();

            foreach (XElement masterBillOfLading in masterBillOfLadings)
            {
                string bolId = (string)masterBillOfLading.Attribute("internalId");
                string bolType = (string)masterBillOfLading.Attribute("type");
                string bolCreatedBy = (string)masterBillOfLading.Attribute("createBy");
                DateTime bolCreatedDate = (DateTime)masterBillOfLading.Attribute("createDate");
                string bolUpdatedBy = (string)masterBillOfLading.Attribute("updateBy");
                DateTime bolUpdatedDate = (DateTime)masterBillOfLading.Attribute("updateDate");

                XElement referenceNumbers = masterBillOfLading.Element("ReferenceNumbers");
                foreach (XElement referenceNumber in referenceNumbers.Elements("ReferenceNumber"))
                {
                    string referenceNumberType = (string)referenceNumber.Attribute("type");
                    Boolean referenceNumberPrimary = (Boolean)referenceNumber.Attribute("isPrimary");
                    string referenceNumberID = (string)referenceNumber.Attribute("internalId");
                    string referenceNumberStr = (string)referenceNumber;

                    dt.Rows.Add(new object[] {
                        bolId,
                        bolType,
                        bolCreatedBy,
                        bolCreatedDate,
                        bolUpdatedBy,
                        bolUpdatedDate,
                        referenceNumberType,
                        referenceNumberPrimary,
                        referenceNumberID,
                        referenceNumberStr
                    });

                }
            }

        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多