时间:2011-04-18 12:47:31

标签: c# linq-to-xml

这是一项简单的任务,但我无法使其发挥作用。给出以下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()) { //...}

对于任何tipps来说,我看不出问题......: - /

4 个答案:

答案 0 :(得分:4)

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

它可能在根元素中寻找的后代...如果您知道根元素被称为product,您可以使用:

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

(我无法测试您现有的代码,以确切了解为什么它现在不适合您,我很害怕。)

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

答案 1 :(得分:1)

使用此:

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

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

我对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);
        }