C# XPath 不选择某些子节点

C# XPath not selects some child nodes

我正在尝试使用 XPath 表达式:.//*[@class='newsContent newsClosed']/b,但它不起作用,总是 returns 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 中,两个表达式都正常工作。

假设这是 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 来 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