2011-04-05 48 views
1

我有包含whicjh可以添加一些子分支導航樹XPath表達式:如何使XPath表達式更通用?

/html/body/div[@id='application-wrapper']/div/div[2]/div/div[3]/div/div[2]/div/div/div/div[3]/div/**div[1]**/div[1]/table/tbody/tr/td[2]/div[@id='gwt-uid-17']/a 

/html/body/div[@id='application-wrapper']/div/div[2]/div/div[3]/div/div[2]/div/div/div/div[3]/div/**div[2]**/div[1]/table/tbody/tr/td[2]/div[@id='gwt-uid-58']/a 

/html/body/div[@id='application-wrapper']/div/div[2]/div/div[3]/div/div[2]/div/div/div/div[3]/div/**div[3]**/div[1]/table/tbody/tr/td[2]/div[@id='gwt-uid-83']/a 

我需要它類似於下面的給出,但無法做到這一點的通用聲明

//div[@role='treeitem']/a[text()='Situation']/ancestor::table//div[1]//a 

有人可以點亮一些燈嗎?

從評論更新

我可以看到3個節點[DIV [1]在 第一個表達式,DIV [2]在第二 表達和DIV [3]在第三 表達]使,而不是寫直到 DIV [100]我希望把它作爲DIV [%d] 但我不能這樣做

+1

請解釋,英語,正是你想要的節點。最終這將導致一個強大的XPath表達式。 – 2011-04-05 00:35:02

+0

我可以看到3個子節點[div [1]在第一個表達式,div [2]在第二個表達式和div [3]在第三個表達式]所以而不是寫直到div [100]我想把它作爲div [%] d]但我無法這樣做 – Maalamaal 2011-04-05 00:37:23

+0

我相信你不關心這些div,對嗎?你想要某種鏈接。請正確解釋*你想要提取什麼。 – 2011-04-05 00:44:18

回答

0

所有你需要的是唯一標識節點的最短表達( s)你想要的。例如,表達式

//div[@id='gwt-uid-17']/a 

相當於上面的第一行,因爲id是唯一的(據推測)。

如果你想要的目標下的「情況」的鏈接的鏈接,你可以嘗試

//a[text()='Situation']//table//a[1] 

但我需要看到的XML知道,如果這是正確的。

0

假設這是有效的XHTML,這id實際上是一個唯一的標識符,你不需要任何上述指定div S上的層次,並且可以使用XPath表達式是這樣的:

//div[@id='gwt-uid-17']/a 

根據您的語言綁定,您還可以使用變量在XPath表達式,因此可以使用通用表述是這樣的:

//div[@id='$theDivIWant']/a 
1

如果的值3210個屬性唯一地標識的元素,則該選擇恰好所有這三個元件a短表達式爲:

//div[@id='gwt-uid-17' or @id='gwt-uid-58' or @id='gwt-uid-83']/a 

然而,評估//縮寫可以是非常低效的,因此不推薦。

是選擇這三個a元素,將是更有效的一個XPath表達式是

/html/body/div[@id='application-wrapper']/div/div[2]/div/div[3] 
    /div/div[2]/div/div/div/div[3]/div/div[not(position() >3)]/div[1] 
    /table/tbody/tr/td[2] 
    /div[@id='gwt-uid-17' or @id='gwt-uid-58' or @id='gwt-uid-83']/a 
+1

問題是即使頁面的不相關部分發生變化,「高效」表達式也會很容易中斷。一般來說,我不會推薦HTML解析的策略。 – 2011-04-05 11:43:21

+0

我認爲這幾乎是答案。檢查我的更新問題從評論。 – 2011-04-05 18:34:42

+1

@馬克 - 托馬斯:你提到的解析實際上是屏幕抓取。任何XPath表達式只有在完全解析XML文檔(一次又一次)之後才被評估。所以,不是「parisng」,而是「評估」 - 讓我們把基礎知識作爲一個開始...... – 2011-04-06 14:31:57