如何将泛型 xml 读入泛型分层类

How can I read generic xml into a generic hierarchical class

提问人:Stephen Lee Parker 提问时间:8/24/2023 最后编辑:AShStephen Lee Parker 更新时间:8/24/2023 访问量:31

问:

基本上,我想编写一个通用的XML查看器...给定如下内容:

<Settings>
    <User Name="Terry" BDay="09-01-1966">
        <Spouse>
            <Name>Jerri</Name>
        </Spouse>
    </User>
    <User Name="Cliff" BDay="10-18-1980"/>
</Settings>

并显示如下内容:

Settings =    
    User =        
        .Name = Terry
        .BDay = 09-01-1966
        Spouse =
            Name = Jerri        
    User =
        .Name = Cliff
        .BDay = 10-18-1980

在缩进标签名称和子节点和属性之前,属性会由句点标记。

我想使用一个类,如下所示:

public class XHierarchy
{
    public string Name { get; set; }
    public string Value { get; set; }
    public List<XHierarchy> Items { get; set; } = new List<XHierarchy>();
}

如果我手动创建一些测试数据,我的模型/类可以正常工作。我遇到的问题是弄清楚如何将数据从 xml 文件读取到类中。我希望它适用于任何有效的 xml,而不仅仅是遵循测试数据架构的东西。

C# XML 解析 层次结构

评论


答:

1赞 jdweng 8/24/2023 #1

请尝试以下操作:

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

namespace ConsoleApplication2
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement root = doc.Root;
            XHierarchy xHierarchy = new XHierarchy();
            xHierarchy.Parse(root);
        }
        public class XHierarchy
        {
            public string Name { get; set; }
            public string Value { get; set; }
            public List<KeyValuePair<string, string>> Attributes { get; set; }
            public List<XHierarchy> Items { get; set; }

            public void Parse(XElement element)
            {
                Name = element.Name.LocalName;
                if (element.FirstNode != null)
                {
                    XmlNodeType type = element.FirstNode.NodeType;
                    if(type == XmlNodeType.Text) Value = element.FirstNode.ToString();
                }
                foreach(XAttribute attribute in element.Attributes())
                {
                    if (Attributes == null) Attributes = new List<KeyValuePair<string, string>>();
                    Attributes.Add(new KeyValuePair<string, string>(attribute.Name.LocalName, (string)attribute));
                }
                foreach(XElement child in element.Elements())
                {
                    if (Items == null) Items = new List<XHierarchy>();
                    XHierarchy childHierarchy = new XHierarchy();
                    Items.Add(childHierarchy);
                    childHierarchy.Parse(child);
                }

            }

        }
    }
}

评论

0赞 Stephen Lee Parker 8/25/2023
谢谢 - 这按原样工作,但我通过使用 Stack<XElement 删除了递归>
0赞 jdweng 8/25/2023
堆栈不会提供适当的父/子关系。