从XML创建树

时间:2011-06-06 06:41:55

标签: c# xml parsing

我正在尝试从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>

任何指导方针?

3 个答案:

答案 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#

如果您这样做,我的原始答案适用。创建一个可以与中间格式轻松序列化的数据结构。