我正在尝试从C#中的xml创建以下树结构:
Root
-->A
--->1
--->2
-->B
--->1
--->2
xml会是这样的:
<root>
<parent1 name="A">
<child name=1>
<child name=2>
</parent1>
<parent2 name="B">
<child name=1>
<child name=2>
</parent2>
</root>
任何指导方针?
答案 0 :(得分:5)
假设你想要它的ASCII艺术......这个单行Linq查询:
string tree = doc.Root.DescendantsAndSelf().Aggregate("",
(bc, n) => bc + n.Ancestors().Aggregate("", (ac, m) => (m.ElementsAfterSelf().Any() ? "| " : " ") + ac,
ac => ac + (n.ElementsAfterSelf().Any() ? "+-" : "\\-")) + n.Name + "\n");
将您的XML转换为:
\-Root
\-parent1
| +-child
| \-child
\-parent2
+-child
\-child
我是否因为单行答案而获奖? ; - )
答案 1 :(得分:2)
var doc = System.XML.Linq.XElement.Parse(xmlString);
XDocument 是树。
答案 2 :(得分:0)
旧答案,假设您已控制XML
您可以尝试创建所需的数据结构,模拟填充该数据结构的控制台应用程序,并使用XmlSerializer
自动输出示例XML文件。 C#将能够导入结果而无需额外的代码。
如果要自定义XML,可以使用System.Xml.Serialization
命名空间中的属性来标记代码,并获取自定义元素/属性名称。
修改强>
删除了代码示例,因为它不适用于最终答案。
您拥有的XML不利于C#中的简单XML序列化。如果您使用我在旧版本的答案中提出的建议,您会发现这是真的。
我建议您在C#中创建分层数据结构,以C#中的方式映射您要解决的问题,而不是试图围绕您碰巧拥有的XML数据进行弯曲。
拥有该结构后,请为每种数据类型实施IXmlSerializable
。
请注意自定义XML序列化很麻烦,所以如果可以,您应该使序列化/数据工作以支持您的代码,而不是相反。
您可以通过编写XSLT将数据转换为更适合XML序列化的格式来解决这个问题。这是在C#中应用XSLT转换的一种方法:
How to apply an XSLT Stylesheet in C#
如果您这样做,我的原始答案适用。创建一个可以与中间格式轻松序列化的数据结构。