XPathを介して属性ノードの値を抽出する


270

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

回答:


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

オリジナルとは、属性を持つchild[@name]要素childを意味しますname。あなたが欲しいchild/@name


14
同意する、問題は属性の値を取得する方法でした
Vladtn '16

5
私は....タグの間にのみ値/説明/データ存在を抽出したい場合はどう
ディヌデューク

147

値のみ(属性名なし)を取得するには、次を使用しますstring()

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

FN:文字列() fucntionはとその引数の値を返しますxs:string。引数が属性の場合、属性の値をとして返しますxs:string


1
ではxqilla呼び出す必要がありましたxs:string。なんでかしら。
krlmlr 2013

1
@krlmlrおそらくxsXPath関数の名前空間プレフィックスです。したがって、それらは他と混同されません。
acdcjunior 2013

4
笑。これが実際に質問に答える唯一の答えです。+1
james.garriss 2018

3
これはxmllintの最初のヒットのみを提供します
crazyduck

1
属性のリストがあり、その値が必要な場合はどうなりますか?string()は最初の値だけを返すようです。
damluar

9

あなたは使うべきです //Parent[@id='1']/Children/child/data(@name)

属性はシリアル化できないため、xmlのような結果で返すことはできません。必要なことは、data()関数を使用して属性からデータを取得することです。


9

上記のように:

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

述語で指定されたに属するname4つのchildノードの属性のみを出力します。次に、述語をに変更して、次のノードのセットを取得する必要があります。Parent[@id=1][@id=2]childParent

ただし、Parentノードを完全に無視して使用する場合:

//child/@name

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"

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

これは、要素に2つの属性があり、別の属性を使用して1つの属性を取得できる場合に使用できます。


3

@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

3

名前空間のあるすべてのxmlにはlocal-name()を使用します

//*[local-name()='Parent'][@id='1']/*[local-name()='Children']/*[local-name()='child']/@name 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.