在List <t> </t>中递归读取XML树结构

时间:2014-05-21 09:51:13

标签: c# .net xml

我有一个XML文件,除了其他东西之外还有以下结构。

<start something="1">
    <into intoSomething="1">
    <node nodeAtt="1"> 
        <thisChanges change="1"/>
    </node>
    <node nodeAtt="1"> 
        <thisChanges change="1"/>
    </node>
    <start something="1">
        <node nodeAtt="1"> 
            <thisChanges change="1"/>
        </node>
        <node nodeAtt="1"> 
            <thisChanges change="1"/>
        </node>
        <start something="1">
            <node nodeAtt="1"> 
                <thisChanges change="1"/>
            </node>
            <node nodeAtt="1"> 
                <thisChanges change="1"/>
            </node>
        </start>
        <node nodeAtt="1"> 
            <thisChanges change="1"/>
        </node>
        <node nodeAtt="1"> 
            <thisChanges change="1"/>
        </node>
    </start>
    <node nodeAtt="1"> 
        <thisChanges change="1"/>
    </node>
    <node nodeAtt="1"> 
        <thisChanges change="1"/>
    </node>
</start>

在.net中递归读取这些列表的最佳方法是什么? XML文件中还有其他内容,但我将分别处理这些部分。我还想将“node”中的所有内容解析为字符串,而不是读取其属性。

提前致谢。

2 个答案:

答案 0 :(得分:0)

这需要复合模式。

http://www.dofactory.com/Patterns/PatternComposite.aspx#_self1

使用列表执行此操作需要T为某种类型,可以是另一个列表或节点。

至于阅读它你听说过DOM吗?

http://msdn.microsoft.com/en-us/library/hf9hbf87%28v=vs.110%29.aspx

它基本上将xml解析为数据结构。所以你可能会在这里重新发明轮子。

答案 1 :(得分:0)

我建议的方法是在实例上实现IEnumerable<T>。该实现将在您的xml中遍历树并构建您感兴趣的node实例。

然后只需拨打ToList即可。

XDocument xmlFile = //use whatever source you like, doesnt even need to be an XDocument
TreeWalker walker = new TreeWalker(xmlfile);
var list = walker.ToList();

如果您使用XDocument,获取所有node元素的一种非常简单的方法是XDocument.Descendants(XName)。这将为你做所有的“树行走”。