我尝试使用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中,两个表达式都正常工作。
答案 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了解演示。