首页 文章

通过XPath提取属性节点的值

提问于
浏览
212

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

  • 119

    @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
    
  • 5

    如上所述:

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

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

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

    //child/@name
    

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

    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

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

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

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

  • 1

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

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

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

    原始 child[@name] 表示元素 child ,其属性为 name . 你想要 child/@name .

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

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

相关问题