자바에서 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 답변
-
다음의 명령문들 사이에 하고자 하시는 일들을 추가하시면 됩니다:
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 텍스트를 읽어올 수 있겠지요.
댓글 입력