我尝试获取xml文件中属性值的所有属性值。
i am try this xpath:-
var xPath = '//*[local-name() = "dist_region" and ' +
' contains(concat(@value, ","), "' + array_top[i] + ',")]' +
'/preceding-sibling::*/@*';
但是它让我回到了节点的顶端 当输入的值匹配时,它返回上面的所有属性值 但我想要所有兄弟属性值 这是我的ml格式: -
<products>
<product_id value="1">
<tab_id value="351">
<tab_name value="test1"/>
<region_timezone value="1"/>
<registrationstatus value="2"/>
<eventstatus value="2"/>
<dist_activity value="4"/>
<dist_activity value="10066"/>
<dist_activity value="10070"/>
<dist_region value="4909"/>
<dist_region value="4902"/>
<dist_region value="4905"/>
<dist_value value="55"/>
<dist_value value="342"/>
<dist_value value="86"/>
</tab_id>
</product_id>
<product_id value="2">
<tab_id value="351">
<tab_name value="test1"/>
<region_timezone value="1"/>
<registrationstatus value="2"/>
<eventstatus value="2"/>
<dist_activity value="4"/>
<dist_activity value="10066"/>
<dist_activity value="10070"/>
<dist_region value="4912"/>
<dist_region value="4908"/>
<dist_region value="4901"/>
<dist_value value="55"/>
<dist_value value="342"/>
<dist_value value="86"/>
</tab_id>
</product_id>
</products>
现在的输出是: -
test1,1,2,2,4,10066,10070
预期产出: -
1,351,test1,1,2,2,4,10066,10070,4909,4902,4905,55,342,86
如何获取所有属性值请解决此查询 感谢。
答案 0 :(得分:1)
稍微改变你的xapht就行了。
将/preceding-sibling::*
替换为/ancestor::product_id/descendant-or-self::*
。
解释你做了什么:
'//*[local-name() = "dist_region" and contains(concat(@value, ","), "' + array_top[i] + ',")]'
您正在寻找属性值中具有给定值的 dist_region 。这将是例如元素<dist_region value="4909"/>
此元素的下一步是'/preceding-sibling::*/@*
所有元素的所有属性值都是在同一级别的当前元素之前的文档顺序。这导致您看到的输出。
你应该做什么:
由于您的声明预期输出: -
您似乎希望获得当前dist_region所属的product_id的所有属性。因此使用:
ancestor::product_id/descendant-or-self::*/@*
由于:
ancestor::product_id
在当前元素中找到以上的product_id 。
并且下一步descendant-or-self::*/@*
在任何深度的任何孩子中找到任何属性
就是这样。
Somme附加命令:
我不知道你为什么要使用//*[local-name() = "dist_region" and ...]
//dist_region[...]/
也应该这样做。
输出:
1 351 test1 1 2 2 4 10066 10070 4909 4902 4905 55 342 86