2016-07-29 166 views
0

我試圖使用XPath表達式:.//*[@class='newsContent newsClosed']/b,但它不工作,總是返回0個元素。C#XPath不選擇一些子節點

然後我試圖改變.//*[@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

提供[mcve]。你聲稱這是XHTML,所以這個問題很可能是你沒有爲'b'指定命名空間。 –

回答

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到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