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

조회수 3442회

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'인 엘리먼트 하나를 검색하는 기능을 만들어 보고 싶은 것입니다.

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

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 텍스트를 읽어올 수 있겠지요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)