通过XML文档迭代

发布于 2025-01-20 05:02:28 字数 1432 浏览 3 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你是年少的欢喜 2025-01-27 05:02:28

从评论来看,您的问题是如何反序列化嵌套记录。

像这样的类结构似乎有效:

public class Records
{
    [XmlElement("Record")]
    public List<Record> Items { get; } = new();
}

public class Record
{
    [XmlAttribute("contentId")]
    public int ContentId { get; set; }
    
    [XmlElement("Record")]
    public Record ChildRecord { get; set; }
    
    [XmlElement("Field")]
    public List<Field> Fields { get; } = new();
}

public class Field
{
    [XmlAttribute("id")]
    public int Id { get; set; }
    
    [XmlElement("Reference")]
    public List<Reference> References { get; } = new();
    
    [XmlArray("ListValues")]
    public List<ListValue> ListValues { get; } = new();
    
    [XmlText]
    public string Content { get; set; }
}

public class Reference
{
    [XmlAttribute("id")]
    public int Id { get; set; }
}

public class ListValue
{
    [XmlAttribute("id")]
    public int Id { get; set; }
    
    [XmlText]
    public string Content { get; set; }
}

请参阅 本文档介绍如何使用各种属性。

我没有费心去反序列化所有属性,或者 MetadataLevelCounts 部分 - 这些都是读者的练习!

使用 XmlSerializer,例如:

using var reader = new StringReader(input);
var records = (Records)new XmlSerializer(typeof(Records)).Deserialize(reader);

在 dotnetfiddle.net 上查看

From the comments, your question is how you deserialize the nested records.

A class structure like this seems to work:

public class Records
{
    [XmlElement("Record")]
    public List<Record> Items { get; } = new();
}

public class Record
{
    [XmlAttribute("contentId")]
    public int ContentId { get; set; }
    
    [XmlElement("Record")]
    public Record ChildRecord { get; set; }
    
    [XmlElement("Field")]
    public List<Field> Fields { get; } = new();
}

public class Field
{
    [XmlAttribute("id")]
    public int Id { get; set; }
    
    [XmlElement("Reference")]
    public List<Reference> References { get; } = new();
    
    [XmlArray("ListValues")]
    public List<ListValue> ListValues { get; } = new();
    
    [XmlText]
    public string Content { get; set; }
}

public class Reference
{
    [XmlAttribute("id")]
    public int Id { get; set; }
}

public class ListValue
{
    [XmlAttribute("id")]
    public int Id { get; set; }
    
    [XmlText]
    public string Content { get; set; }
}

See this doc on how to use the various attributes.

I haven't bothered to deserialize all of the attributes, or the Metadata or LevelCounts sections -- those are an exercise for the reader!

Use an XmlSerializer, for example:

using var reader = new StringReader(input);
var records = (Records)new XmlSerializer(typeof(Records)).Deserialize(reader);

See it on dotnetfiddle.net.

羁〃客ぐ 2025-01-27 05:02:28

将数据平铺到一张表中虽然很混乱,但可以做到。见下文

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

namespace ConsoleApplication21
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";

        static void Main(string[] args)
        {
            StreamReader sReader = new StreamReader(FILENAME);
            //skip 1st line containing UTF-16
            sReader.ReadLine();
            XDocument doc = XDocument.Load(sReader);

            DataTable dt = new DataTable();
            dt.Columns.Add("Field Id", typeof(int));
            dt.Columns.Add("Field Name", typeof(string));
            dt.Columns.Add("Alias", typeof(string));
            dt.Columns.Add("Main Content ID", typeof(int));
            dt.Columns.Add("Main Level ID", typeof(int));
            dt.Columns.Add("Main Module ID", typeof(int));
            dt.Columns.Add("Sub Content ID", typeof(int));
            dt.Columns.Add("Sub Level ID", typeof(int));
            dt.Columns.Add("Sub Module ID", typeof(int));
            dt.Columns.Add("Type", typeof(int));
            dt.Columns.Add("Field Value Name", typeof(string));
            dt.Columns.Add("Field Text", typeof(string));
            dt.Columns.Add("List Value Id", typeof(int));
            dt.Columns.Add("Display Name", typeof(string));
            dt.Columns.Add("List Value Text", typeof(string));
            dt.Columns.Add("Reference Id", typeof(int));
            dt.Columns.Add("Reference Text", typeof(string));

            foreach (XElement fieldDefinition in doc.Descendants("FieldDefinition"))
            {
                DataRow newRow = dt.Rows.Add();
                newRow["Field Id"] = (int)fieldDefinition.Attribute("id");
                newRow["Field Name"] = (string)fieldDefinition.Attribute("name");
                newRow["Alias"] = (string)fieldDefinition.Attribute("alias");
            }

            foreach (XElement record in doc.Root.Elements("Record"))
            {
                int mainContentId = (int)record.Attribute("contentId");
                int mainLevelId = (int)record.Attribute("levelId");
                int mainModuleId = (int)record.Attribute("moduleId");

                foreach(XElement subRecord in record.Elements("Record"))
                {
                    int subContentId = (int)record.Attribute("contentId");
                    int subLevelId = (int)record.Attribute("levelId");
                    int subModuleId = (int)record.Attribute("moduleId");

                    foreach (XElement field in subRecord.Elements("Field"))
                    {
                        int fieldId = (int)field.Attribute("id");
                        int fieldType = (int)field.Attribute("type");
                        string fieldName = (string)field;

                        DataRow fieldRow = dt.AsEnumerable().Where(x => x.Field<int>("Field Id") == fieldId).First();
                        fieldRow["Main Content ID"] = mainContentId;
                        fieldRow["Main Level ID"] = mainLevelId;
                        fieldRow["Main Module ID"] = mainModuleId;
                        fieldRow["Sub Content ID"] = subContentId;
                        fieldRow["Sub Level ID"] = subLevelId;
                        fieldRow["Sub Module ID"] = subModuleId;
                        fieldRow["Type"] = fieldType;
                        fieldRow["Field Value Name"] = fieldName;

                    }
                    foreach (XElement field in record.Elements("Field"))
                    {
                        int fieldId = (int)field.Attribute("id");
                        int fieldType = (int)field.Attribute("type");
                        string fieldText = (string)field;
                        int count = 0;
                        DataRow fieldRow = dt.AsEnumerable().Where(x => x.Field<int>("Field Id") == fieldId).First();
                        List<XElement> listValues = field.Descendants("ListValue").ToList();
                        List<XElement> references = field.Elements("Reference").ToList();
                        if (listValues.Count > 0)
                        {
                            foreach (XElement listValue in listValues)
                            {
                                count++;
                                int listValueId = (int)listValue.Attribute("id");
                                string displayName = (string)listValue.Attribute("displayName");
                                string listValueText = (string)listValue;

                                if (count > 1)
                                {
                                    string fieldName = fieldRow.Field<string>("Field Name");
                                    string alias = fieldRow.Field<string>("Alias");
                                    fieldRow = dt.Rows.Add();
                                    fieldRow["Field Id"] = fieldId;
                                    fieldRow["Field Name"] = fieldName;
                                    fieldRow["Alias"] = alias;
                                }
                                fieldRow["Main Content ID"] = mainContentId;
                                fieldRow["Main Level ID"] = mainLevelId;
                                fieldRow["Main Module ID"] = mainModuleId;
                                fieldRow["Type"] = fieldType;
                                if(fieldText.Length > 0) fieldRow["Field Text"] = fieldText;
                                fieldRow["List Value Id"] = listValueId;
                                fieldRow["Display Name"] = displayName;
                                fieldRow["List Value Text"] = listValueText;
                            }
                        }
                        count = 0;
                        if (references.Count > 0)
                        {
                            foreach (XElement reference in references)
                            {
                                count++;
                                int referenceId = (int)reference.Attribute("id");
                                string referenceText = (string)reference;
                                if (count > 1)
                                {
                                    string fieldName = fieldRow.Field<string>("Field Name");
                                    string alias = fieldRow.Field<string>("Alias");
                                    fieldRow = dt.Rows.Add();
                                    fieldRow["Field Id"] = fieldId;
                                    fieldRow["Field Name"] = fieldName;
                                    fieldRow["Alias"] = alias;
                                }
                                fieldRow["Main Content ID"] = mainContentId;
                                fieldRow["Main Level ID"] = mainLevelId;
                                fieldRow["Main Module ID"] = mainModuleId;
                                fieldRow["Type"] = fieldType;
                                if (fieldText.Length > 0) fieldRow["Field Text"] = fieldText;
                                fieldRow["Reference Id"] = referenceId;
                                fieldRow["Reference Text"] = referenceText;
                            }
                        }
                        if((listValues.Count == 0) && (references.Count == 0))
                        {
                            fieldRow["Type"] = fieldType;
                            if (fieldText.Length > 0) fieldRow["Field Text"] = fieldText;
                        }
                    }
                }
            }
            dt = dt.AsEnumerable().OrderBy(x => x.Field<int>("Field Id")).CopyToDataTable();

        }
 
    }
 
}

To flatten data into one table is messy but can be done. See below

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

namespace ConsoleApplication21
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";

        static void Main(string[] args)
        {
            StreamReader sReader = new StreamReader(FILENAME);
            //skip 1st line containing UTF-16
            sReader.ReadLine();
            XDocument doc = XDocument.Load(sReader);

            DataTable dt = new DataTable();
            dt.Columns.Add("Field Id", typeof(int));
            dt.Columns.Add("Field Name", typeof(string));
            dt.Columns.Add("Alias", typeof(string));
            dt.Columns.Add("Main Content ID", typeof(int));
            dt.Columns.Add("Main Level ID", typeof(int));
            dt.Columns.Add("Main Module ID", typeof(int));
            dt.Columns.Add("Sub Content ID", typeof(int));
            dt.Columns.Add("Sub Level ID", typeof(int));
            dt.Columns.Add("Sub Module ID", typeof(int));
            dt.Columns.Add("Type", typeof(int));
            dt.Columns.Add("Field Value Name", typeof(string));
            dt.Columns.Add("Field Text", typeof(string));
            dt.Columns.Add("List Value Id", typeof(int));
            dt.Columns.Add("Display Name", typeof(string));
            dt.Columns.Add("List Value Text", typeof(string));
            dt.Columns.Add("Reference Id", typeof(int));
            dt.Columns.Add("Reference Text", typeof(string));

            foreach (XElement fieldDefinition in doc.Descendants("FieldDefinition"))
            {
                DataRow newRow = dt.Rows.Add();
                newRow["Field Id"] = (int)fieldDefinition.Attribute("id");
                newRow["Field Name"] = (string)fieldDefinition.Attribute("name");
                newRow["Alias"] = (string)fieldDefinition.Attribute("alias");
            }

            foreach (XElement record in doc.Root.Elements("Record"))
            {
                int mainContentId = (int)record.Attribute("contentId");
                int mainLevelId = (int)record.Attribute("levelId");
                int mainModuleId = (int)record.Attribute("moduleId");

                foreach(XElement subRecord in record.Elements("Record"))
                {
                    int subContentId = (int)record.Attribute("contentId");
                    int subLevelId = (int)record.Attribute("levelId");
                    int subModuleId = (int)record.Attribute("moduleId");

                    foreach (XElement field in subRecord.Elements("Field"))
                    {
                        int fieldId = (int)field.Attribute("id");
                        int fieldType = (int)field.Attribute("type");
                        string fieldName = (string)field;

                        DataRow fieldRow = dt.AsEnumerable().Where(x => x.Field<int>("Field Id") == fieldId).First();
                        fieldRow["Main Content ID"] = mainContentId;
                        fieldRow["Main Level ID"] = mainLevelId;
                        fieldRow["Main Module ID"] = mainModuleId;
                        fieldRow["Sub Content ID"] = subContentId;
                        fieldRow["Sub Level ID"] = subLevelId;
                        fieldRow["Sub Module ID"] = subModuleId;
                        fieldRow["Type"] = fieldType;
                        fieldRow["Field Value Name"] = fieldName;

                    }
                    foreach (XElement field in record.Elements("Field"))
                    {
                        int fieldId = (int)field.Attribute("id");
                        int fieldType = (int)field.Attribute("type");
                        string fieldText = (string)field;
                        int count = 0;
                        DataRow fieldRow = dt.AsEnumerable().Where(x => x.Field<int>("Field Id") == fieldId).First();
                        List<XElement> listValues = field.Descendants("ListValue").ToList();
                        List<XElement> references = field.Elements("Reference").ToList();
                        if (listValues.Count > 0)
                        {
                            foreach (XElement listValue in listValues)
                            {
                                count++;
                                int listValueId = (int)listValue.Attribute("id");
                                string displayName = (string)listValue.Attribute("displayName");
                                string listValueText = (string)listValue;

                                if (count > 1)
                                {
                                    string fieldName = fieldRow.Field<string>("Field Name");
                                    string alias = fieldRow.Field<string>("Alias");
                                    fieldRow = dt.Rows.Add();
                                    fieldRow["Field Id"] = fieldId;
                                    fieldRow["Field Name"] = fieldName;
                                    fieldRow["Alias"] = alias;
                                }
                                fieldRow["Main Content ID"] = mainContentId;
                                fieldRow["Main Level ID"] = mainLevelId;
                                fieldRow["Main Module ID"] = mainModuleId;
                                fieldRow["Type"] = fieldType;
                                if(fieldText.Length > 0) fieldRow["Field Text"] = fieldText;
                                fieldRow["List Value Id"] = listValueId;
                                fieldRow["Display Name"] = displayName;
                                fieldRow["List Value Text"] = listValueText;
                            }
                        }
                        count = 0;
                        if (references.Count > 0)
                        {
                            foreach (XElement reference in references)
                            {
                                count++;
                                int referenceId = (int)reference.Attribute("id");
                                string referenceText = (string)reference;
                                if (count > 1)
                                {
                                    string fieldName = fieldRow.Field<string>("Field Name");
                                    string alias = fieldRow.Field<string>("Alias");
                                    fieldRow = dt.Rows.Add();
                                    fieldRow["Field Id"] = fieldId;
                                    fieldRow["Field Name"] = fieldName;
                                    fieldRow["Alias"] = alias;
                                }
                                fieldRow["Main Content ID"] = mainContentId;
                                fieldRow["Main Level ID"] = mainLevelId;
                                fieldRow["Main Module ID"] = mainModuleId;
                                fieldRow["Type"] = fieldType;
                                if (fieldText.Length > 0) fieldRow["Field Text"] = fieldText;
                                fieldRow["Reference Id"] = referenceId;
                                fieldRow["Reference Text"] = referenceText;
                            }
                        }
                        if((listValues.Count == 0) && (references.Count == 0))
                        {
                            fieldRow["Type"] = fieldType;
                            if (fieldText.Length > 0) fieldRow["Field Text"] = fieldText;
                        }
                    }
                }
            }
            dt = dt.AsEnumerable().OrderBy(x => x.Field<int>("Field Id")).CopyToDataTable();

        }
 
    }
 
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文