具有多个谓词的Xpath表达式

use*_*767 45 xml xpath predicate

我正在尝试构建一个复杂的xpath表达式,它将回答以下条件.

从下面的XML数据中,返回User实体,其中:

  1. 他的登录名是" user1 "
  2. 他的名字是" 用户1 "
  3. 他有2个不同的配置文件值,分别是" operator "和" admin "(我不知道前面的确切顺序)

    <user>
      <login>user1</login>
      <name>User 1</name>
      <profile>
        <value>admin</value>
        <id>2</id>
        <description>admin users</description>
      </profile>
      <profile>
        <value>operator</value>  
        <id>1</id>
        <description>Operator</description>
      </profile>
    </user>
    
    <user>
      <login>user2</login>
      <name>User 2</name>
      <profile>
        <value>admin</value>
        <id>4</id>
        <description>admins users</description>
      </profile>
      <profile>
        <value>poweruser</value>  
        <id>5</id>
        <description>power users</description>
      </profile>
    </user>
    
    </root>
    
    Run Code Online (Sandbox Code Playgroud)

有人可以为这种情况提供一个例子吗?

编辑:添加了复杂的配置文件实体

Gre*_*ech 70

以下应该做你想要的:

/root/user[login='user1' and 
           name='User 1' and 
           profile='admin' and
           profile='operator']
Run Code Online (Sandbox Code Playgroud)

profile值进行两次测试可能看起来很奇怪,但由于存在多个profile节点,因此只要至少一个节点与测试匹配,就会满足条件.

你可以比较的原因profile直接到string,即使它实际上是一个node是,string-value一个元素节点的是string-value它的所有后代串联在一起,在这种情况下,仅仅是内容的value.

如果profile包含的元素多于value您必须使用稍微复杂的谓词测试来确定是否存在匹配profile节点value(这应该与您更新的问题一起使用):

/root/user[login='user1' and 
           name='User 1' and 
           profile[value='admin'] and
           profile[value='operator']]
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的快速解决方案.我可以像这样使用XPATH,也可以更改逻辑:/ root/user [login ='user1'] [name ='User 1'] [profile [value ='admin']] [profile [value = '操作符']] (3认同)
  • 有趣 - 我不知道你可能有多个谓词块,但是,它看起来也有效.很酷,现在我也学到了一些东西:-) (2认同)

Dim*_*hev 6

这是一个更准确的答案(目前Greg Beech的答案没有检查问题中的条件3. user元素必须有2个profile孩子):

/*/user
        [login='user1' 
        and            
         name='User 1' 
        and  
         not(profile[3])
        and          
         profile/value='admin' 
        and           
         profile/value='operator'
         ]
Run Code Online (Sandbox Code Playgroud)