获取Xpath值

时间:2016-02-18 13:41:15

标签: xml xpath

我有以下格式的xml格式:

<start>
<contents>
  <content name="content1" id="1582670184">
  <properties name="GIFT_ID" type="data" value="109"/>
  <properties name="KEY_ID" type="data" value="1006"/>
 </content>
 <content name="content2" id="1582670194">
  <properties name="GIFT_ID" type="data" value="110"/>
  <properties name="KEY_ID" type="data" value="1007"/>
 </content>
 <content name="content3" id="12346">
  <properties name="GIFT_ID" type="data" value="111"/>
 </content>
 <content name="content4" id="12345">
  <properties name="GIFT_ID" type="data" value="112"/>
 </content>
</contents>
</start>

我想要满足以下条件的上述xml中的两个值

案例1:如何在<content>标记中获取名称,其中只有&#34; GIFT_ID&#34;是<properties>标记,即内容名称只有&#34; GIFT_ID&#34;存在于属性中。

预期输出为:content3,content 4

案例2:如何获得GIFT_ID的@value,其中包含&#34; KEY_ID&#34;标签不存在。
预期产量为:111,112 请帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

将您的描述翻译成XPath ......

案例1:

//content[properties/@name = 'GIFT_ID' and not(properties/@name != 'GIFT_ID')]/@name

案例2:

//content[not(properties/@name = 'KEY_ID')]/properties[@name = 'GIFT_ID']/@value

答案 1 :(得分:0)

类似的东西:

案例1:

//content[ count(*)=1][//content/properties [@name='GIFT_ID']]/@name

案例2:

//content[ count(*)=1]/properties [@name='GIFT_ID']/@value

修改

上面的两个陈述使得(可能是错误的)假设每个内容标记最多包含一个名为'GIFT_ID'或'KEY_ID'的属性 - 因此使用count(*)= 1.

然而,关于为什么count(*)= 1的要求的Mathias'问题反映了我已经改进了两个select语句以满足要求 对于可能存在以下情况:

  1. 名称不是'GIFT_ID和'KEY_ID'
  2. 的属性
  3. 内容节点包含名为“GIFT_ID。
  4. 的多个”属性“节点的情况

    案例1

    //content[count(properties[not(@name='GIFT_ID')])=0 and properties [@name='GIFT_ID']]/@name
    

    案例2

    //content[count(properties[@name='KEY_ID'])=0 and properties [@name='GIFT_ID']]/properties/@value
    

    这只是har07解决方案的替代方案 - 他更简洁,绝对是更好的解决方案。