Linq查询XML属性

时间:2015-05-08 03:40:03

标签: c# xml linq

所以我正在尝试编写一个简单的查询,它从XML文件中获取所有特定属性,但似乎没有任何效果。我已经能够用其他几种XML来做到这一点,但由于某种原因,我在这里工作的那个只是不合作。任何建议或意见都将非常感激。

以下是XML的样子。

<Doc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="Name" xsi:schemaLocation="[there's a link here]" Name="Name">
<Wrapper>
<Box_Collection>
<Box name="Test A" test="Test B"/>
<Box name="Test C" test="Test D"/>
<Box name="Test E" test="Test F"/>
</Box_Collection>
</Wrapper>
</Doc>

这是我的C#代码:

        XDocument customers = XDocument.Load(@"C:\Users\folder\file.xml");

        IEnumerable<string> names =
            from c in customers.Descendants("Box").Attributes("name")
            select c.Value;

        string nameList = "Names:";


        foreach (string c in names)
        {
            namer += " " + c;
        }

        textBox.AppendText(nameList);

2 个答案:

答案 0 :(得分:1)

原因是您的XML在根元素处声明了默认名称空间:

xmlns="Name"

默认情况下,XML元素继承祖先默认命名空间,除非另有指定(f.e使用指向不同命名空间URI的显式前缀)。您可以使用 XNamespace +元素的本地名称指向命名空间中的元素:

XNamespace ns = "Name";
IEnumerable<string> names =
            from c in customers.Descendants(ns+"Box").Attributes("name")
            select c.Value;

答案 1 :(得分:0)

您的文档的默认名称空间为&#34;名称&#34;。在选择如下节点时需要引用命名空间:

    IEnumerable<string> names =
        from c in customers.Descendants(XName.Get("Box", "Name")).Attributes("name")
        select c.Value;