2016-07-29 4 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 для демонстрации.

Смежные вопросы