자바에서 XPath를 사용해서 XML 데이터를 어떻게 읽을 수 있을까요?


XPath를 사용해서 XML 데이터를 읽고 싶습니다. 그래서 XML 문서를 파싱하지 않고 정보들을 얻어오고 싶습니다.

제가 하고자 하는 것은:

URL을 통해서 온라인으로부터 XML 문서를 얻어와서 그 데이터를 파싱하기 위해 XPath를 사용하고자 합니다. 그것을 실행하기 위한 두 개의 메소드를 만들고자 합니다. 하나는 attribute id를 가지는 특정 노드의 자식 노드들을 얻어오는 것이고, 다른 하나는 특정 자식 노드의 값을 가지고 검색하는 것입니다.

<?xml version="1.0"?>
<howto>
  <topic name="Java">
      <url>http://www.rgagnonjavahowto.htm</url>
  <car>taxi</car>
  </topic>
  <topic name="PowerBuilder">
       <url>http://www.rgagnon/pbhowto.htm</url>
       <url>http://www.rgagnon/pbhowtonew.htm</url>
  </topic>
  <topic name="Javascript">
        <url>http://www.rgagnon/jshowto.htm</url>
  </topic>
 <topic name="VBScript">
       <url>http://www.rgagnon/vbshowto.htm</url>
 </topic>
 </howto>

위의 예제에서, @name 애트리뷰트를 사용해서 특정 엘리먼트들을 검색하거나, @name 애트리뷰트가 'Javascript'인 엘리먼트 하나를 검색하는 기능을 만들어 보고 싶은 것입니다.

제 질문을 해결해주시면 정말 감사하겠습니다^^

  • 2016년 06월 03일에 작성됨

조회수 182


1 답변


좋아요
0
싫어요
채택취소하기

다음의 명령문들 사이에 하고자 하시는 일들을 추가하시면 됩니다:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(<uri_as_string>);
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile(<xpath_expression>);

그 후, 코드에서 정의된 문서 (doc)와 원하는 결과 타입을 입력으로 넣어 expr.evaluate()를 호출하고 결과 객체를 해당 결과 타입으로 캐스트 하면 됩니다.

XPath 표현에 대해서 추가적으로 설명을 붙이자면,

'PowerBuilder'의 첫 번째 URL 엘리먼트의 텍스트 데이터를 얻기 위한 XPath 표현은 다음과 같습니다.

/howto/topic[@name='PowerBuilder']/url/text()

두번째 URL 엘리먼트의 텍스트 데이터는 다음과 같겠지요.

/howto/topic[@name='PowerBuilder']/url[2]/text()

해당 데이터를 얻기 위한 명령은 다음과 같이 정의하시면 됩니다.

expr.evaluate(doc, XPathConstants.STRING);

만약 주어진 노드의 URL 에리먼트의 개수를 알지 못한다면, 다음과 같이 하시는 것이 좋습니다. 즉, XPathConstants.STRING은 하나의 문자열 값을 얻고자 할 때, XPathConstants.NODESET은 여러개의 값을 읽어오고자 할 때 사용합니다.

XPathExpression expr = xpath.compile("/howto/topic[@name='PowerBuilder']/url");
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);

NodeList를 반복하면 각각의 URL 텍스트를 읽어올 수 있겠지요.

  • 2016년 06월 04일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close