XPath를 사용하여 속성 얻기


344

XML 구조는 다음과 같습니다.

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

어떻게 값 얻을 수 lang( langeng첫 번째 요소에 대한 책 제목을)?


답변:


472

첫 번째 요소에 대해 lang (책 제목의 lang = eng) 값을 얻으려면 어떻게해야합니까?

사용 :

/*/book[1]/title/@lang

이것은 다음을 의미합니다 .

XML 문서 맨 위 요소의 lang첫 번째 book자식의 title 요소 의 속성을 선택하십시오 .

이 속성의 문자열 값만 얻으려면 표준 XPath 함수를 사용하십시오string() .

string(/*/book[1]/title/@lang)

3
@AbhishekAsthana, XPath 표현식을 평가 한 결과 lang속성 의 문자열 값이 정확하게 생성됩니다 . 속성에 대괄호가 포함되어 있지 않으면 XPath 표현식 평가 결과에 포함되지 않습니다. 내 생각에 이들은 사용중인 (부적절한) 도구로 추가 된 것입니다.
Dimitre Novatchev

6
그래, 나는 문제를 알아 냈다. 그것은 soapUI가 그것을 표시하는 방법 일 뿐이지 만 xpath 값을 사용할 때 그 괄호는 사용되지 않습니다. 나는 이것을 많은 시간을 보았습니다. 문제는 의자와 키보드 사이의 도구가 아닙니다.
Abhishek Asthana

4
@KorayTugay, XPath 표현식 은 0 개 이상의 속성 노드로 구성된 노드 세트를 /*/book[1]/title/@lang 선택 하고 string(/*/book[1]/title/@lang)평가시 XPath 표현식 은이 노드 세트의 문자열 값을 생성합니다. 이는 첫 번째 (문서 순서)의 문자열 값입니다. 이 노드 세트의 노드.
Dimitre Novatchev

4
@KorayTugay, No, 첫 번째 표현은를 선택 하고 "반환"하지 않습니다. 노드 세트 이며이 노드 세트는 문자열이 아닙니다. 노드는 문자열이 아닙니다. 노드는 트리 의 노드 입니다 . XML 문서는 노드 트리입니다. lang="eng"이름이 "lang"이고 네임 스페이스에 속하지 않으며 문자열 값이 "eng"인 속성 노드의 많은 텍스트 표현 중 하나입니다.
Dimitre Novatchev

1
@Vladimir, v가 "my : vvv"와 같은 네임 스페이스 URI에 해당하는 경우 myPrefix (v 일 수 있지만 필요하지는 않음)를 동일한 네임 스페이스에 연결하는 매핑을 사용하는 XPath 엔진의 호스트에서 만들 수 있습니다. -uri "my : vvv". 그리고 title / @ myPrefix : lang을 사용하여 속성을 선택합니다. 이러한 맵핑이 작성되는 방법은 구현에 따라 다르며 XPath 엔진 호스트의 문서를 읽어야합니다. 이것은 .NET에서 특정 방식으로 수행되고 Saxon에서 다른 방식으로 수행됩니다. 이러한 매핑이없는 경우 다음을 사용하십시오. title / @ * [name () = 'v : lang']
Dimitre Novatchev

47

감사! 이것은 Div 내부의 데이터 속성과 비슷한 문제를 해결했습니다.

<div id="prop_sample" data-want="data I want">data I do not want</div>

이 xpath를 사용하십시오. //*[@id="prop_sample"]/@data-want

이것이 다른 누군가를 돕기를 바랍니다!


6

아래의 xPath 패턴을 사용해보십시오.

  XPathExpression expr = xPath.compile("/bookstore/book/title[@lang='eng']")

5
lang 값이 아닌 eng 값을 가진 lang 속성을 가진 / bookstore / book 아래의 XML 제목 요소를 선택합니다 . 즉, 단일 속성이 아닌 요소 목록을 선택합니다.
JFK

2

당신은 또한 그것을 얻을 수 있습니다

string(//bookstore/book[1]/title/@lang)    
string(//bookstore/book[2]/title/@lang)

JavaScript와 함께 XMLDOM을 사용하는 경우 다음과 같은 코드를 작성할 수 있습니다.

var n1 = uXmlDoc.selectSingleNode("//bookstore/book[1]/title/@lang");

그리고 n1.text당신에게 가치를 줄 것입니다"eng"


2

당신이 사용할 수있는:

(//@lang)[1]

즉, 이름이 "lang"인 모든 속성 노드를 가져 와서 첫 번째 노드를 가져옵니다.


0

다음은 XPath 및 VTD-XML을 사용하여 "lang"의 속성 값을 가져 오는 스 니펫입니다.

import com.ximpleware.*;
public class getAttrVal {
    public static void main(String s[]) throws VTDException{
        VTDGen vg = new VTDGen();
        if (!vg.parseFile("input.xml", false)){
            return ;
        }
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/bookstore/book/title/@lang");
        System.out.println(" lang's value is ===>"+ap.evalXPathToString());
    }
}

0

PostgreSQL을 사용하는 경우 이것이 올바른 방법입니다. 이는 채워진 데이터 가있는 장부 테이블 TITLEPRICE 열 이있는 것으로 가정 한 것 입니다. 여기 쿼리가 있습니다

SELECT xpath('/bookstore/book/title/@lang', xmlforest(book.title AS title, book.price AS price), ARRAY[ARRAY[]::TEXT[]]) FROM book LIMIT 1;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.