如何通过XPath提取属性节点的值?
示例XML文件是:
<parents name='Parents'>
<Parent id='1' name='Parent_1'>
<Children name='Children'>
<child name='Child_2' id='2'>child2_Parent_1</child>
<child name='Child_4' id='4'>child4_Parent_1</child>
<child name='Child_1' id='3'>child1_Parent_1</child>
<child name='Child_3' id='1'>child3_Parent_1</child>
</Children>
</Parent>
<Parent id='2' name='Parent_2'>
<Children name='Children'>
<child name='Child_1' id='8'>child1_parent2</child>
<child name='Child_2' id='7'>child2_parent2</child>
<child name='Child_4' id='6'>child4_parent2</child>
<child name='Child_3' id='5'>child3_parent2</child>
</Children>
</Parent>
</parents>
到目前为止,我有这个XPath字符串:
//Parent[@id='1']/Children/child[@name]
它只返回 child
个元素,但我希望得到 name
属性的值 .
对于我的示例XML文件,这是我想要的输出:
Child_2
Child_4
Child_1
Child_3
6 回答
@ryenus,你需要遍历结果 . 这就是我在vbscript中的表现;
如上所述:
将仅输出属于其谓词
[@id=1]
指定的Parent
的4个child
节点的name
属性 . 然后,您需要将谓词更改为[@id=2]
,以获取下一个Parent
的child
节点集 .但是,如果您完全忽略
Parent
节点并使用:您可以一次性选择所有
child
节点的name
属性 .要获取值(没有属性名称),请使用
string()
:string(//Parent[@id='1']/Children/child/@name)
fn:string() fucntion将其参数的值返回为
xs:string
. 如果它的参数是一个属性,它将返回属性的值为xs:string
.你应该使用
//Parent[@id='1']/Children/child/data(@name)
属性无法序列化,因此您无法在xml查找结果中返回它们 . 您需要做的是使用data()函数从属性中获取数据 .
原始
child[@name]
表示元素child
,其属性为name
. 你想要child/@name
.这是可以在元素具有2个属性的情况下使用的情况,并且我们可以在另一个属性的帮助下获得一个属性 .