C# 从XML创建树

C# 从XML创建树,c#,xml,parsing,C#,Xml,Parsing,我试图从C#中的xml创建以下树结构: xml如下所示: <root> <parent1 name="A"> <child name=1> <child name=2> </parent1> <parent2 name="B"> <child name=1> <child name=2> </pare

我试图从C#中的xml创建以下树结构:

xml如下所示:

<root>
    <parent1 name="A">
        <child name=1>
        <child name=2>
    </parent1>
    <parent2 name="B">
        <child name=1>
        <child name=2>
    </parent2>
</root>

有什么指导方针吗

var doc = System.XML.Linq.XElement.Parse(xmlString);

XDocument是一棵树

旧答案,假设您控制了XML

您可以尝试创建所需的数据结构,模拟填充该数据结构的控制台应用程序,并使用
XmlSerializer
自动输出示例XML文件。C#将能够导入结果,而无需额外代码

如果要自定义XML,可以使用
System.XML.Serialization
命名空间中的属性来标记代码,并获取自定义元素/属性名称

编辑:

删除了代码示例,因为它不适用于最终答案

您拥有的XML不利于在C#中进行简单的XML序列化。如果你玩弄我在旧版本答案中提出的建议,你会发现这是真的

我建议您在C#中创建层次化数据结构,该结构映射到您试图在C#中解决的问题,而不是试图将它们围绕您碰巧拥有的XML数据

一旦有了这种结构,就可以为每种数据类型实现
IXmlSerializable

请注意,自定义XML序列化是一件痛苦的事情,因此如果可以的话,应该让序列化/数据工作以支持代码,而不是相反

您可以通过编写XSLT将数据转换为更适合XML序列化的格式来绕过这一事实。下面是一种在C#中应用XSLT转换的方法:


如果你这样做,我的原始答案适用。制作一个数据结构,它可以很容易地从中间格式序列化到中间格式。

假设您想要它的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

我的答案只有一行,能获奖吗?;-)

我在找一个没有Linq的东西到底为什么?什么版本的.NET?请明确你想要什么。我已经有了我试图在这里创建树的xml。@Sara:明白了。我编辑了我的答案,以便更适合你的情况。最终,XML序列化是在数据结构和XML之间转换的最佳方式。不幸的是,这将是更多的工作。但是,与直接使用XML或编写不使用XML序列化的XML->data converter相比,根据最终结果进行编码会更愉快。+1,尽管与前面的
-->
标记不完全匹配;)这不是一行,只是一句话。几乎是真的。。不过,作为一个单行程序,您会得到一个非常长的滚动条@Merlyn确切的格式有点枯燥,没有那么大的挑战性,但你看。。。聚合(“,(bc,n)=>bc+n.祖先().Aggregate(“,(ac,m)=>“-”+ac)+“>”+n.Name+“\n”);
\-Root
  \-parent1 
  | +-child
  | \-child
  \-parent2 
    +-child
    \-child