使用XpathNavigator和HtmlAgilityPack查找InnerHtml值

时间:2011-08-22 02:38:55

标签: c# html-agility-pack xpathnavigator

test.xml的一部分

<tr class="a"> 
    <td align="left" nowrap="true">desc1</td> 
    <td align="left">desc2</td>  
    <td>desc3</td>  
    <td align="left">desc4</td> 
    <td align="left">desc5</td>
    <td>desc6</td> 
    <td>desc7</td> 
    <td>desc8</td>
    <td class="nr">desc9</td>
</tr>

//创建XpathNavigator以获取td内的最后一个值,即desc9

> HtmlDocument document = new HtmlDocument();
        document.Load(Server.MapPath("test.xml"));

        XPathNavigator xPathNavigator = document.CreateNavigator();
        object o = xPathNavigator.Evaluate("/table[1]/tbody[1]/tr[2]/td[9]");

调试器显示的值可以如下评估,这非常麻烦。

((HtmlAgilityPack.HtmlNodeNavigator)((new System.Linq.SystemCore_EnumerableDebugView(((MS.Internal.Xml.XPath.XPathSelectionIterator)(o)))).Items[0])).Value

到达desc9的最佳方式是什么?

3 个答案:

答案 0 :(得分:2)

我没有使用过XPathNavigator,但这里有一个类似于SelectNodes / SelectSingleNode样式和HTML Agility Pack的解决方案。

string xPathSearch = "/table[1]/tbody[1]/tr[2]";
HtmlNode tableRow = doc.DocumentNode.SelectSingleNode(xPathSearch);
string description9 = tableRow.ChildNodes[9].InnerText;

OR

string xPathSearch = "/table[1]/tbody[1]/tr[2]/td[9]";
HtmlNode tableColumn = doc.DocumentNode.SelectSingleNode(xPathSearch);
string description9 = tableColumn.InnerText;

仅供参考 - HTML Agility Pack的最佳文档似乎是Source附带的示例。不确定为什么不在文档中单独下载。

答案 1 :(得分:0)

类似的东西:

/table[1]/tbody[1]/tr[@class="a"]/td[last()]

查看XPath Syntax

答案 2 :(得分:0)

我认为你错了。

我相信你应该做的就是:

document.DocumentNode.SelectSingleNode("/table[1]/tbody[1]/tr[2]/td[9]");

我找不到链接到您的文档的在线副本,但您可以查看http://htmlagilitypack.codeplex.com/releases/view/44954处的文档以获取更多详细信息。

另外,如果您只是阅读XML,那么您使用html敏捷包还是有任何理由,还是只是您的测试文件是有效的XML?