2014-11-05 1 views
0

Я пытался получить значение ниже, используя HtmlAgilityPack, но безуспешно. Я использую SelectSingleNode.htmlagilitypack using SelectSingleNode

Вот мой html.

<html> 
<body> 
    <table> 
     <tr><td>One</td></tr>  
    </table> 
</body> 
</html> 

И ниже - код.

HtmlDocument doc = new HtmlDocument(); 
doc.Load("C:\\test.html"); 

HtmlNode test = doc.DocumentNode.SelectSingleNode("/html/body/table/tbody/tr/td"); 
Console.WriteLine(test.InnerHtml); 

test (HtmlNode) переменная равна нулю.

Как я получу значение, в котором находится One.

ответ

1

Как показано ваш образец не имеют tbody узел, чтобы ваш XPath не будет возвращать ни одного узла (null для SelectSingleNode).

Fix:

HtmlNode test = doc.DocumentNode.SelectSingleNode("/html/body/table/tr/td"); 

Debugging совет: строить XPath медленно и проверьте каждый результат/дочерние узлы:

 "/html/body/table/" - some children 
    "/html/body/table/tbody/" - null 
    "/html/body/table/tr/" - some children 
    "/html/body/table/tr/td" - score 
+0

Спасибо за это. Да, я знаю, что нет ничего, но когда я использовал инструмент разработчика Chrome (F12), затем скопируйте xpath элемента (щелкните правой кнопкой мыши), xpath включает текст tbody. – Odee

1

От Using XPath in SelectSingleNode: Retrieving individual element from XML if it's present вам нужно использовать text():

var test = doc.DocumentNode.SelectSingleNode("/html/body/table/tr/td/text()"); 

Кроме того, вам нужно удалить tbody. В вашем html нет tbody.

+0

Почему вы ожидаете дочерний узел (текст) существовать, когда родитель не может быть найден ? –

+0

Хорошая точка. Просто заметили, что исходный xpath ссылается на узел 'tbody', который не существует. –

+0

+1: для фактического ответа ('tbody 'в образце отсутствует). Обратите внимание, что 'text()' абсолютно не связано с проблемой и не требуется (если только не ищет текстовые узлы внутри «td», что не является примером OP), InnerHtml включает также все узлы - также то же самое для конкретного примера) –