Development note/Java

[Java] XML를 Xpath를 이용하여 데이터를 취득하는 방법(XPathFactory)

v명월v 2019. 8. 8. 00:15

안녕하세요. 명월입니다.


이 글은 Java환경에서 XML를 Xpath를 이용하여 데이터를 취득하는 방법(XPathFactory)에 대한 글입니다.


이전에 XMLStream을 이용해서 XML 다루는 방법과 Jsoup를 이용해서 XML 데이터를 취득하는 방법에 대해 소개한 적이 있습니다.

링크 - [Java강좌 - 21] XMLStreamWriter, XMLStreamReader, XmlFactory

링크 - [Java] Jsoup를 이용해서 XML파일(HTML)을 다루는 방법


그리고 Xpath를 이용해서 데이터를 취득하는 방법에 대해서도 소개한 적이 있는데 이건 표준 라이브러리를 이용해서 취득하는게 아니고 제가 Xpath로 취득하는 방법에 대해 클래스를 만든 적이 있습니다.

링크 - [Java] Xml를 파서로 xPath형식으로 읽어드리기

링크 - [Java] Xml파서로 xPath형식으로 xml작성하기


꽤 오래전에 만든 건데 한번 정리가 필요하다고는 생각되는데 잘 되는지는 모르겠네요.. 아마 당시에 만들때도 꽤 신경써서 만든 것이라 되기는 할 것입니다.

그러나 표준 라이브러리가 있는데 굳이 저처럼 만들 필요는 없고 버그나 성능에 대해 검증이 되어 있는 라이브러리라면 표준 라이브러리를 사용하는게 좋습니다.


표준 라이브러리로 XPathFactory가 있습니다. XPathFactory를 이용해서 데이터를 취득하겠습니다.


예제로는 제가 현재 티스토리 블로그를 이용하고 있으니 티스토리의 RSS를 이용해서 테스트를 해보면 되겠네요.

예제 링크 - http://nowonbun.tistory.com/rss


위 예제에서 channel 태그 밑의 item에서 title값만 추출하겠습니다.

import java.io.InputStream;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

public class Main {
  public static void main(String[] args) {
    try {
      // 제 rss 주소입니다.
      URL uri = new URL("https://nowonbun.tistory.com/rss");
      HttpsURLConnection connection = (HttpsURLConnection) uri.openConnection();
      // 티스토리 측에서 User-agent를 넣치 않으면 403에러를 뱉어내는 군요.
      connection.setRequestProperty("user-agent", "xpath Tester");
      // 응답코드입니다.
      int code = connection.getResponseCode();
      System.out.println(code);
      try (InputStream stream = connection.getInputStream()) {
        InputSource is = new InputSource(stream);
        // Document 클래스로 xml데이터를 취득
        Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
        
        // xpath 팩토리로 객체를 만듭니다.
        XPath xpath = XPathFactory.newInstance().newXPath();
        // xpath를 컴파일 한후에..
        XPathExpression expression = xpath.compile("//rss/channel/item");
        // Node 집합단위로 데이터를 취득합니다.
        NodeList nodelist = (NodeList) expression.evaluate(document, XPathConstants.NODESET);
        for (int idx = 0; idx < nodelist.getLength(); idx++) {
          // item 밑의 title를 취득합니다.
          expression = xpath.compile("title");
          Node node = (Node) expression.evaluate(nodelist.item(idx), XPathConstants.NODE);
          // 출력합니다.
          System.out.println(node.getTextContent());
        }
      }
    } catch (Throwable e) {
      e.printStackTrace();
    }
  }
}

rss 파일에서 item의 title만 출력이 되었습니다. 예전에 Jsoup 라이브러로 데이터를 취득해 올 때와 같은 값을 내보냅니다.

언제고 xpath 문법에 대해서도 조사를 해야하겠네요. xpath 문법을 모르면 이 라이브러리를 100% 사용할 수 없으니깐요..


여기까지 Java환경에서 XML를 Xpath를 이용하여 데이터를 취득하는 방법(XPathFactory)에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.