2016-02-18 162 views
0

我有以下格式的XML格式:获取Xpath的价值

<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>标签获取名称其中只有“GIFT_ID”存在于<properties>标记中,即只有“GIFT_ID”出现在属性中的内容名称。

预期成果是:content3,内容4

案例2:如何获得GIFT_ID的@value对于这些内容,其中“KEY_ID”的标签是不存在的。
预期输出为:111,112。
请帮助我如何弄清楚这一点。

回答

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 
+0

感谢您的答复。我尝试运行上面的两条语句,但它在输出中给出了无匹配。 –

+0

@ Mr.Singthoi你的XPath版本是什么?使用XPath 1.0和2.0进行测试,以上两种版本都可以使用。这里是演示:http:// www。xpathtester.com/xpath/8dd5f82edd38eef66d53f690a10f5b76 – har07

+0

@ Mr.Singthoi你测试过什么工具?您确定您使用_exactly_来测试您在问题中显示的输入XML文档吗?如果您实际使用的是编程语言中的XPath库,请显示该代码并相应地标记问题。 –

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。

然而,反映Mathias“的问题上,为什么COUNT(*)= 1是人有我精的两个SELECT语句,以满足 对于其中可能存在的情况下,要求:

  1. 属性与其他名称'GIFT_ID'和'KEY_ID'
  2. 内容节点包含名为'GIFT_ID'的多个'合适'节点的情况。

案例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解决一个选择 - 他是更加简洁和绝对是一个更好的解决方案。

+0

为什么“count(*)= 1”是一个要求? –

+0

@MathiasMüller,编辑答案澄清更多 –

+0

现在好了,但在这种情况下,你不应该使用计数,因为你不必。 –