web-dev-qa-db-ja.com

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
234
Rehman
//Parent[@id='1']/Children/child/@name 

元のchild[@name]は、属性childを持つ要素nameを意味します。 child/@nameが欲しいです。

301
lweller

(属性名なしで)値だけを取得するには、string()を使用します。

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

fn:string() 関数は、引数の値をxs:stringとして返します。引数が属性の場合、その属性の値をxs:stringとして返します。

127
acdcjunior

上記のように:

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

述語[@id=1]で指定されたnameに属する4つのchildノードのParent属性のみを出力します。次に、述語を[@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
Vinod Srivastav

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

属性は直列化できないため、xml形式の結果に戻すことはできません。あなたがする必要があるのはdata()関数を使って属性からデータを取得することです。

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

これは、要素が2つの属性を持ち、別の属性を使用して1つの属性を取得できる場合に使用できるケースです。

4
Akshay Dubey

@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
1
NickC

名前空間を持つすべてのxmlでlocal-name()を使用します

//*[local-name()='Parent'][@id='1']/*[local-name()='Children']/*[local-name()='child']/@name 
0
metal