通过XPath提取属性节点的值


269

如何通过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

Answers:


349
//Parent[@id='1']/Children/child/@name 

您的原始child[@name]意思是child具有属性的元素name。你要child/@name


14
我同意,问题是如何获取属性的值
Vladtn

5
如果我想只提取值/描述/数据出现在标签之间....
迪努杜克

146

要仅获取值(不包含属性名称),请使用string()

string(//Parent[@id='1']/Children/child/@name)

FN:字符串()温控功能将返回其作为参数的值xs:string。如果其参数是属性,则它将返回属性的值xs:string


1
xqilla必要打电话xs:string。我想知道为什么。
krlmlr

1
@krlmlr可能xs是XPath函数的名称空间前缀。因此,它们不会与其他人混淆。
acdcjunior 2013年

4
大声笑。这是实际回答问题的唯一答案。+1
james.garriss18年

3
这将只提供在xmllint先打
crazyduck

1
如果我有属性列表并且需要它们的值怎么办?string()似乎只返回第一个值。
damluar


7

如上回答:

//Parent[@id='1']/Children/child/@name 

将仅输出其谓词所指定name的4个child节点的属性。然后,您需要更改谓词以获取next 的节点集。Parent[@id=1][@id=2]childParent

但是,如果您Parent完全忽略该节点并使用:

//child/@name

您可以一次性选择name所有child节点的属性。

name="Child_2"
name="Child_4"
name="Child_1"
name="Child_3"
name="Child_1"
name="Child_2"
name="Child_4"
name="Child_3"

5
//Parent/Children[@  Attribute='value']/@Attribute

在元素具有2个属性的情况下可以使用这种情况,我们可以在另一个属性的帮助下获得一个属性。


1

@ryenus,您需要遍历结果。这就是我在vbscript中要做的;

Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.setProperty "SelectionLanguage", "XPath"
xmlDoc.load("kids.xml")

'Remove the id=1 attribute on Parent to return all child names for all Parent nodes
For Each c In xmlDoc.selectNodes ("//Parent[@id='1']/Children/child/@name")
    Wscript.Echo c.text
Next

1

对于具有名称空间的所有xml,请使用local-name()

//*[local-name()='Parent'][@id='1']/*[local-name()='Children']/*[local-name()='child']/@name 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.