如何按名称获取节点

本文关键字:节点 获取 何按名 | 更新日期: 2023-09-27 17:50:23

这是一个简单的任务,但是我做不到。给定以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<product>
    <item1></item1>
    <item2></item2>
    <item3></item3>
</product>

我想获得product内的所有节点。以下两次尝试没有返回节点,我不明白为什么:

XDocument meteoDoc = XDocument.Load("data.xml");
foreach (var item in meteoDoc.Descendants("product")) {//...}
foreach (var item in meteoDoc.Descendants().Where(x => x.Name == "product").Nodes()) {//...}

如下所示,将返回所有节点:

foreach (var item in meteoDoc.DescendantNodes()) { //...}

谢谢你的提示,我看不出问题…: -/

如何按名称获取节点

您的第一次尝试是请求所有的Descendants 称为 product。您的第二次尝试是查找所有称为product的后代的直接子节点。

它可能在根元素中寻找后代…如果您知道根元素名为product,则只需使用:

foreach (var item in meteoDoc.Root.Descendants())

(我不能测试你现有的代码来找出为什么它现在不能为你工作,我担心。)

注意Descendants只会发现后代元素 -如果您想要所有后代节点,您需要DescendantNodes方法。

使用

XDocument meteoDoc = XDocument.Load("data.xml");
foreach (var item in meteoDoc.Root.Descendants())
{
    // ...
}

试试这个:

        foreach (var item in meteoDoc.Descendants("product"))
        {
            foreach (var prod in item.Descendants())
            {
                // do something
            }
        }

我对xml做了一些更改,这样数据就更有条理了,我可以给你一段代码来完成你的任务。

static void Main(string[] args)
    {
        //Data.xml
        /*
        <?xml version="1.0" encoding="UTF-8"?>
            <product>
                <item>
                    <name>test</name>
                </item>
                <item>
                    <name>test2</name>
                </item>
                <item>
                    <name>test3</name>
                </item>
            </product>
         */

        XDocument meteoDoc = XDocument.Load("data.xml");
        var result = from c in meteoDoc.Descendants("item")
                     select new { Name = c.Element("name").Value };
        foreach (var item in result)
        {
            Console.WriteLine(item.Name);
        }