2011-01-29 110 views
188

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

[使用XPath获取属性](http:// stackoverflow。com/questions/4531995/getting-attribute-using-xpath) – tripleee 2015-12-03 08:53:13

回答

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

你原来child[@name]意味着一个元素child它有一个属性name。您需要child/@name

+13

我同意,问题是如何获取属性的值 – Vladtn 2013-04-16 19:24:15

+3

如果我只想提取标签之间存在的值/描述/数据,该怎么办? ... – 2017-02-22 07:52:13

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 
101

得到公正的价值(无属性名称),使用string()

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

fn:string()温控功能将返回其参数的值作为xs:string。如果它的参数是一个属性,它将因此返回该属性的值为xs:string

+1

'xqilla`有必要调用`xs:string`。我想知道为什么。 – krlmlr 2013-07-22 20:00:11

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

这是可以使用的情况下,其中元素有2个属性,我们可以得到一个属性与另一个帮助。

5

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

的属性不能被序列化,所以你不能在一个XML寻找结果回报他们。你需要做的是使用data()函数从属性获取数据。

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"