c#无法使用xpath读取元素属性

时间:2010-07-28 13:19:09

标签: c# xml xpath

此代码无法读取特定属性 - 更具体地说是name属性。 相反,它读取节点元素的文本并对它们进行连续 - 结果:1F20被添加到列表中

var reader = new StringReader(xml);
            var xmlreader = new XmlTextReader(reader);
            xmlreader.WhitespaceHandling = WhitespaceHandling.None;
            var doc = new XPathDocument(xmlreader);
            var nav = doc.CreateNavigator();
            XPathExpression expr = nav.Compile("/Area/Lights/Light[@Name]");
            XPathNodeIterator iterator = nav.Select(expr);

            var list = new List<string>();
            while (iterator.MoveNext())
            {
                XPathNavigator nav2 = iterator.Current.Clone();
                list.Add(nav2.Value);  
            }

我也尝试过: XPathExpression expr = nav.Compile(“// Light [@Name]”);

返回空白

这是我想读的xml:

<Light Index="1" SetChannel="72" GetChannel="60" Name="y1 d1">
      <Nodes>1F</Nodes>
      <Nodes>20</Nodes>
    </Light>

我做错了什么 - 首次尝试xpath ......

2 个答案:

答案 0 :(得分:3)

这是完整的XML吗?在这里使用您的代码段

XPathExpression expr = nav.Compile("Light/@Name");

只是为了添加XPathExpression expr = nav.Compile("/Area/Lights/Light[@Name]");的用法是一个过滤器,你要求一个Light节点有一个名为Name的属性,或者你可能会做@Name = 'bob'之类的事情,你要求一个Light节点名称等于Bob

的属性

答案 1 :(得分:3)

您正在尝试阅读所有Light - 具有Name - 属性的元素。

尝试//Light[@Name='xyz']/@Name,以便从Name - Light元素中读取Name='xyz' - 属性,//Light/@Name或所有Name [] - 属性。

请记住,{{1}}适用于条件。