【问题标题】:How to Check for Multiple Conditions in Xpath如何在 Xpath 中检查多个条件
【发布时间】:2014-03-13 05:14:22
【问题描述】:

我想检索 id =2 且 pAddress=INDIA 的行/字段的PName

<?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()]";

编辑:

我想获取 id 为 2 且 pAddress=INDIA 的 Pname

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

【问题讨论】:

    标签: java xml xpath


    【解决方案1】:

    可以通过将路径表达式的各个方面移动到谓词中并使用嵌套的嵌套谓词来改进上述两个答案。恕我直言,这使得 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)。

    【讨论】:

      【解决方案2】:

      试试

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

      【讨论】:

        【解决方案3】:
        /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 的字段

        【讨论】:

          【解决方案4】:

          您可以尝试这样做:

          /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 的 &lt;row&gt; 元素,然后获取行的 pName。但是看看这个问题中的示例 XML,没有这样的 &lt;row&gt; 满足这两个标准。如果您要选择 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']
          

          【讨论】:

            【解决方案5】:

            实现上述最简单的方法是

            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()";
            

            您可以在第二行中添加多个条件,由您分隔和/或根据您的需要

            【讨论】:

              【解决方案6】:

              据我了解,您想从两个pNames 获取文本。

              我认为这在当前 xml 的范围内应该适合你:

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

              如果你只想取节点:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-05-12
                • 2016-10-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多