通过XPath提取属性节点的值

Reh*_*man 251 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>
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有这个XPath字符串:

//Parent[@id='1']/Children/child[@name]  
Run Code Online (Sandbox Code Playgroud)

它只返回child元素,但我想拥有name属性的值.

对于我的示例XML文件,这是我想要的输出:

Child_2
Child_4
Child_1
Child_3
Run Code Online (Sandbox Code Playgroud)

lwe*_*ler 325

//Parent[@id='1']/Children/child/@name 
Run Code Online (Sandbox Code Playgroud)

您的原始child[@name]意味着child具有属性的元素name.你想要的child/@name.

  • 我同意,问题是如何获得属性的值 (14认同)
  • 如果我只想提取标签之间存在的值/描述/数据,该怎么办.... (5认同)

acd*_*ior 134

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

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

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

  • 这将仅提供 xmllint 中的第一个命中 (8认同)
  • 如果我有一个属性列表并且需要它们的值怎么办?string() 似乎只返回第一个值。 (8认同)
  • 大声笑.这是实际回答问题的唯一答案.+1 (4认同)

Vin*_*tav 7

如上所述:

//Parent[@id='1']/Children/child/@name 
Run Code Online (Sandbox Code Playgroud)

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

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

//child/@name
Run Code Online (Sandbox Code Playgroud)

您可以一次选择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"
Run Code Online (Sandbox Code Playgroud)

  • 是的......但问题是如何仅返回属性值:`Child_2`等。我在这里的原因是我设法得到尽可能多的信息,我只想要属性值,我使用了Google,并且得出了这个问题。 (3认同)

小智 6

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

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

  • 属性上的 data() 函数在 xmllint 中给出错误“XPath 错误:无效表达式”。 (2认同)

ϻᴇᴛ*_*ᴛᴀʟ 6

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

//*[local-name()='Parent'][@id='1']/*[local-name()='Children']/*[local-name()='child']/@name 
Run Code Online (Sandbox Code Playgroud)


小智 5

//Parent/Children[@  Attribute='value']/@Attribute
Run Code Online (Sandbox Code Playgroud)

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