C#XPath不会选择一些子节点

时间:2016-07-29 13:18:34

标签: c# xml xpath xmldocument

我尝试使用XPath表达式:.//*[@class='newsContent newsClosed']/b,但它不起作用,总是返回0个元素。

然后我尝试更改.//*[@class='newsContent newsClosed']上的表达式,并且它正常工作。

为什么第一个表达式不起作用?

我使用XmlDocument.SelectSingleNode来检索元素。

XHTML的一部分:

<div class="newsContent newsClosed">
    <b>some text that I need to take</b>
    <br />
    <p>
        text
    </p>
    <p>
        <b>text</b>
        <br />
        <b>text</b>
        <b>text</b>
    </p>
...

在FirePath中,两个表达式都正常工作。

1 个答案:

答案 0 :(得分:2)

假设这是XHTML,那么您需要指定元素的名称空间http://www.w3.org/1999/xhtml

var resolver = new XmlNamespaceManager(new NameTable());

resolver.AddNamespace("html", "http://www.w3.org/1999/xhtml");

var result = doc.SelectSingleNode(
    ".//*[@class='newsContent newsClosed']/html:b", resolver);

我个人的偏好是完全抛弃XPath并使用LINQ to XML:

XNamespace html = "http://www.w3.org/1999/xhtml";

var result = (string) doc.Descendants()
    .Where(element => (string) element.Attribute("class") == "newsContent newsClosed")
    .Elements(html + "b")
    .Single();

请参阅this fiddle了解演示。