XPath를 통해 속성 노드 값 추출


269

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

답변:


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

원본 child[@name]child속성이있는 요소 를 의미 합니다 name. 당신은 원합니다 child/@name.


14
나는 질문이 속성의 가치를 얻는 방법이라는 것에 동의했다
Vladtn

5
태그 사이에있는 값 / 설명 / 데이터 만 추출하려면 어떻게해야합니까? ...
Dinu Duke

146

속성 이름없이 값만 얻으려면 string()다음을 사용하십시오 .

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

FN : 문자열 () fucntion는 인수의 값을 반환합니다 xs:string. 인수가 속성 인 경우 속성 값을로 반환합니다 xs:string.


1
xqilla전화가 필요했습니다 xs:string. 왜 그런지 궁금합니다.
krlmlr

1
@krlmlr 아마도 xsXPath 함수의 네임 스페이스 접두사 일 것 입니다. 그래서 그들은 다른 사람들과 섞이지 않습니다.
acdcjunior

4
LOL. 이것은 실제로 질문에 대답하는 유일한 대답입니다. +1
james.garriss

3
이 xmllint가의 첫 번째 히트 제공 할 것입니다
crazyduck

1
속성 목록이 있고 해당 값이 필요한 경우 어떻게합니까? string ()은 첫 번째 값만 반환하는 것 같습니다.
damluar

8

사용해야합니다 //Parent[@id='1']/Children/child/data(@name)

속성을 직렬화 할 수 없으므로 XML 결과로 반환 할 수 없습니다. 당신이해야 할 일은 data () 함수를 사용하여 속성에서 데이터를 얻는 것입니다.


7

위에서 답변 한대로 :

//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"

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

이것은 element에 2 개의 속성이있는 경우 사용할 수 있으며 다른 속성을 사용하여 하나의 속성을 얻을 수 있습니다.


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

1

네임 스페이스가있는 모든 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.