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

到目前为止,我有这个XPathstring:

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

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

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

 Child_2 Child_4 Child_1 Child_3 
 //Parent[@id='1']/Children/child/@name 

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

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

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

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

属性不能被序列化,所以你不能以xml的结果返回它们。 你需要做的是使用data()函数从属性中获取数据。

如上所述回答:

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

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

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

 //child/@name 

您可以一次select所有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" 
 //Parent/Children[@ Attribute='value']/@Attribute 

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

@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