提问人:Stephen Lee Parker 提问时间:8/24/2023 最后编辑:AShStephen Lee Parker 更新时间:8/24/2023 访问量:31
如何将泛型 xml 读入泛型分层类
How can I read generic xml into a generic hierarchical class
问:
基本上,我想编写一个通用的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,而不仅仅是遵循测试数据架构的东西。
答:
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
堆栈不会提供适当的父/子关系。
评论