2014-03-13 39 views
2

檢查多個條件我想以檢索的行/場,其ID = 2和pAddress =印度如何在XPath

<?xml version="1.0"?> 
<mysqldump > 
<database name="MyDb"> 
<table name="DescriptionTable"> 
<row> 
<field name="id">1</field> 
<field name="pName">XYZ</field> 
<field name="pAddress">INDIA</field> 
<field name="pMobile">1234567897</field> 
</row> 
<row> 
<field name="id">2</field> 
<field name="pName">PQR</field> 
<field name="pAddress">UK</field> 
<field name="pMobile">755377</field> 
</row> 
<row> 
<field name="id">3</field> 
<field name="pName">ABC</field> 
<field name="pAddress">USA</field> 
<field name="pMobile">67856697</field> 
</row> 
</table> 
</database> 
</mysqldump> 

String expression="/mysqldump/database[@name='MyDb']/table[@name='DescriptionTable']/row/field[@name='id' and ./text()]"; 

編輯的PName

我想得到PNAME whoese ID爲2和pAddress =印度

String expression="/mysqldump/database[@name='MyDb']/table[@name='DescriptionTable']/row/field[@name='id' and .='2']and[@name='pAddress' and .='INDIA']/../field[@name='pName']/text()"; 

回答

2

上述兩個答案可以通過移動路徑表達式的各方面到謂詞和使用嵌套的嵌套謂詞得到改善的領域。恕我直言,這使XPath的選擇更加人性化。

首先我們找到rowfield@name eq idtext() = "2",從那裏我們可以簡單地選擇從row其在@name eq "pName"field

/mysqldump/database[@name = "MyDb"]/table[@name = "DescriptionTable"]/row[field[@name eq "id"][text() = "2"]]/field[@name = "pName"] 

還要注意明確使用的eq=,EQ被用於我們的屬性選擇比較原子值,在這種情況下,和=用於比較序列(如可以想象的是文本()可能會返回多個項目 - 儘管它不適合您的示例XML)。

0

嘗試

/mysqldump/database[@name='MyDb']/table[@name='DescriptionTable']/row/field[@name='id'][.='2']/following-sibling::field[@name='pName']/text() 
0
/mysqldump/database/table/row/field[@name='id' and .=2]/../field[@name='pName'] 

說明:

/mysqldump/database/table/row/field[@name='id' and .=2] 

獲取字段其中id name屬性= id和值等於2

../ 

前進到父節點。

field[@name='pName'] 

搜索其中屬性名稱包含PNAME

0

你可以嘗試做這樣:

/mysqldump 
/database[@name='MyDb'] 
/table[@name='DescriptionTable'] 
/row[ 
     field[@name[.='id'] and .=2] 
      and 
     field[@name[.='pAddress'] and .='INDIA'] 
    ] 
/field[@name='pName'] 

以上的XPath將選擇<row>元素ID爲2和pAddress =印度,然後得到該行的PNAME。但是在這個問題中查看示例XML,沒有滿足這兩個條件的此類<row>。如果你的意思是選擇行其或者已經ID等於2或具有pAddress等於INDIA,您可以使用or代替and行中的過濾表達式:

/mysqldump 
/database[@name='MyDb'] 
/table[@name='DescriptionTable'] 
/row[ 
     field[@name[.='id'] and .=2] 
      or 
     field[@name[.='pAddress'] and .='INDIA'] 
    ] 
/field[@name='pName'] 
0

最簡單的方式實現上述是

String expression = "/mysqldump/database[@name='MyDb']/table[@name='DescriptionTable']/ 
    row[./field[@name="id"]/text()="2" and ./field[@name="pAddress"]/text()="INDIA"] 
/field[@name="pName"]/text()"; 

您可以通過分隔和/或根據您的需求

0

據我瞭解,第二行中添加多個條件,你想從兩個獲取文本秒。

我想這應該爲你在當前XML的工作範圍:

//row/field[text()='2' OR text()='INDIA']/../field[@name='pName']/text() 

如果你想利用剛剛節點:

//row/field[text()='2' OR text()='INDIA']/../field[@name='pName']