通过XPath提取属性节点的值

时间:2011-01-29 08:31:11

标签: xml xpath

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

8 个答案:

答案 0 :(得分:300)

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

您的原始child[@name]表示具有属性child的元素name。你想要child/@name

答案 1 :(得分:127)

要获取值(没有属性名称),请使用string()

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

fn:string()函数将其参数的值返回为xs:string。如果它的参数是一个属性,它将返回属性的值为xs:string

答案 2 :(得分:6)

如上所述:

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

只会输出属于其谓词name指定的child的4个Parent节点的[@id=1]属性。然后,您需要将谓词更改为[@id=2],以获取下一个child的{​​{1}}个节点集。

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

Parent

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

child

答案 3 :(得分:5)

您应该使用//Parent[@id='1']/Children/child/data(@name)

无法序列化属性,因此您无法在xml查找结果中返回它们。您需要做的是使用data()函数从属性中获取数据。

答案 4 :(得分:4)

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

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

答案 5 :(得分: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

答案 6 :(得分:0)

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

//*[local-name()='Parent'][@id='1']/*[local-name()='Children']/*[local-name()='child']/@name 

答案 7 :(得分:0)

这是使用XPath-

提取属性和文本值的标准公式
  1. 提取Web元素的属性值-

    elementXPath / @ attributeName

  2. 为Web元素提取文本值-

    elementXPath / text()

在您的情况下,这是将返回的xpath

//parent[@name='Parent_1']//child/@name

它将返回:

Child_2
Child_4
Child_1
Child_3