2012-08-12 61 views
1

我试图找到一个HTML文档中的表格与含3列与文本中的第2行。“HTML敏捷性包”与逻辑的XPath查询和

我已经尝试尝试使用下面的查询,我想返回具有前两排表包含在第一列文本节点:

string xpath = @"//table//table[//tr[1]//td[1]//*[contains(text(), *)] and //tr[2]//td[1]//*[contains(text(), *)]]"; 
HtmlNode temp = doc.DocumentNode.SelectSingleNode(xpath); 

它不能正常工作,周一

下面是一些示例HTML,这是我想匹配表:

<table width="100%" cellpadding="0" border="0"> 
     <tbody> 
     <tr> 
      <td width="27%" valign="center"><b><font size="1" face="Helvetica">SOME TEXT<br></font></b></td> 
      <td width="1%"></td> 
      <td width="9%" valign="center"><font size="1" face="Helvetica">SOME TEXT<br></font></td> 
      <td width="1%"></td> 
      <td width="25%" valign="center"><font size="1" face="Helvetica">SOME TEXT<br></font></td> 
      <td width="37%"></td> 
     </tr> 
     <tr> 
      <td valign="center"><font size="1" face="Helvetica">SOME TEXT<br></font></td> 
      <td></td> 
      <td valign="center"><font size="1" face="Helvetica">1<br></font></td> 
      <td></td> 
      <td valign="center"><font size="1" face="Helvetica">SOME TEXT<br></font></td> 
      <td></td> 
     </tr> 
     </tbody> 
</table> 

你注意到列1,3,5在第一2行文字。这就是我想要匹配的。

+2

这将有很大的帮助,如果您编辑您的问题,并插入HTML。 – Sicco 2012-08-12 19:49:20

+0

我已更新该问题。 – xM00x 2012-08-12 20:00:19

回答

1
//table//table[//tr[1]//td[1]//*[contains(text(), *)] and //tr[2]//td[1]//*[contains(text(), *)]] 

许多问题与该XPath表达式

  1. //table//table选择任何table其为table的后代。但是,在提供的XML文档中没有嵌套表格。

  2. table[//tr[1]//td[1]//*[contains(text(), *)]。谓词中的//tr是一个绝对 Xpath表达式 - 它选择整个文档中的所有tr元素 - 不仅在以此table元素为根的子树中。很可能你想要.//tr而不是//tr

  3. //td[1]选择任何td元素是第一td孩子其父 - 但最有可能只想要第一个后代td元素。如果是这样,你需要使用这个XPath表达式:(//td)[1]

  4. //*[contains(text(), *)]这个选择其第一个文本子节点包含第一个子元素的字符串值的任何元素 - 但你只是想验证一个td有后代 - 文本子节点这可以正确地与选择:td[.//text()]

结合所有这些问题的修正,你可能想要的是像

//table 
    [(.//tr)[1]/td[1][.//text()] 
    and 
     (.//tr)[2]/td[1][.//text()] 
    ] 

或者,可以写一个等价的,但更容易理解和更不容易出错表达这样的:

//table 
    [descendant::tr[1]/td[1][descendant::text()] 
and 
    descendant::tr[1]/td[1][descendant::text()] 
    ] 
+0

'string xpath = @“// table [(.// tr)[1]/td [1] [.// text()]和(.//tr[2]/td[1][///text()]]“; HtmlNodeCollection collection = doc.DocumentNode.SelectNodes(xpath);' 这会引发'无效标记'异常。我不知道'HTML Agility Pack'中使用的XPath语法是否略有不同,或者因为我注意到我遵循的一些XPath教程发生了类似的情况。它也会抛出相同的异常,仅仅是'string xpath = @“// // // // // ////// tr)'// – xM00x 2012-08-12 22:41:35

+0

@ xM00x,HAP很可能没有实现标准的XPath语言。第二个表达式评估成功吗? – 2012-08-12 23:04:47

+0

工程就像一个魅力。我吻了你的照片。 – xM00x 2012-08-12 23:18:45