2012-08-12 35 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