如何在Xpath中检查多个条件

时间:2014-03-13 05:14:22

标签: java xml xpath

我想要检索行/字段的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()";

6 个答案:

答案 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']