我想要检索行/字段的PName
,其中id = 2,pAddress = INDIA
<?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 whoese id为2而pAddress = INDIA
String expression="/mysqldump/database[@name='MyDb']/table[@name='DescriptionTable']/row/field[@name='id' and .='2']and[@name='pAddress' and .='INDIA']/../field[@name='pName']/text()";
答案 0 :(得分:2)
通过将路径表达式的各个方面移动到谓词中,并使用嵌套的嵌套谓词,可以改善上述两个答案。恕我直言,这使得XPath选择更具人性化。
首先,我们找到row
field
的{{1}}和@name eq id
,从那里我们只需从text() = "2"
中选择field
} row
。
@name eq "pName"
另请注意明确使用/mysqldump/database[@name = "MyDb"]/table[@name = "DescriptionTable"]/row[field[@name eq "id"][text() = "2"]]/field[@name = "pName"]
和eq
,eq用于比较原子值,在本例中为我们的属性选择,=
用于比较序列(因为可以想象text()可能会返回多个项目 - 尽管它不会为您的示例XML赢得。)
答案 1 :(得分:0)
试
/mysqldump/database[@name='MyDb']/table[@name='DescriptionTable']/row/field[@name='id'][.='2']/following-sibling::field[@name='pName']/text()
答案 2 :(得分:0)
/mysqldump/database/table/row/field[@name='id' and .=2]/../field[@name='pName']
说明:
/mysqldump/database/table/row/field[@name='id' and .=2]
获取id name attribute = id且值等于2
的字段../
转到父节点。
field[@name='pName']
搜索属性名称包含pName
的字段答案 3 :(得分:0)
您可以尝试这样做:
/mysqldump
/database[@name='MyDb']
/table[@name='DescriptionTable']
/row[
field[@name[.='id'] and .=2]
and
field[@name[.='pAddress'] and .='INDIA']
]
/field[@name='pName']
上面的XPath将选择id为2且pAddress = INDIA的<row>
元素,然后获取行的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']
答案 4 :(得分: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()";
您可以在第二行中添加和/或根据您的需要分隔多个条件
答案 5 :(得分:0)
据我了解,您希望从两个pName
获取文字。
我认为这应该适用于当前xml的范围:
//row/field[text()='2' OR text()='INDIA']/../field[@name='pName']/text()
如果你想只取节点:
//row/field[text()='2' OR text()='INDIA']/../field[@name='pName']