2012-07-03 3 views
2

그래서 여기에 몇 가지 XML 파싱을 배우려고합니다. 그 이유는 무엇이든간에 이유를 불문하고 "text()"각 쿼리 끝에, 그렇지 않으면 나 반환 된 null 값을 가져옵니다. 나는이 "text()"결말의 기능을 실제로 이해하지 못한다. 그러나 나는 그것이 필요하지 않다는 것을 안다. 왜 내가 그것을 생략 할 수 없는지 궁금하다. 도와주세요! 내 코드는 다음과 같습니다.XPath 쿼리는 "text()"가 끝나지 않으면 작동하지 않습니다

import org.w3c.dom.*; 
import javax.xml.xpath.*; 
import javax.xml.parsers.*; 
import java.io.IOException; 
import org.xml.sax.SAXException; 

public class ParseClass 
{ 
public static void main(String[] args) 
throws ParserConfigurationException, SAXException, 
IOException, XPathExpressionException 
{ 
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
    domFactory.setNamespaceAware(true); 
    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    Document doc = builder.parse("C:\\Users\\Brandon\\Job\\XPath\\XPath_Sample_Stuff\\catalog.xml"); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 
    XPathExpression expr = xpath.compile("/catalog/book[author='Thurman, Paula']/title/text()"); 
    Object result = expr.evaluate(doc, XPathConstants.NODESET); 
    NodeList nodes = (NodeList) result; 
    for (int i = 0; i < nodes.getLength(); i++) 
    { 
     System.out.println(nodes.item(i).getNodeValue()); 
    } 
    } 
} 

PS. 당신이 눈치 채지 못했을 경우에. 내 구문 분석을 위해 XPath와 DOM을 사용하고 있습니다.

+0

하지만 여전히 요소를 얻는다면 왜 text()없이 null을 반환합니까? –

답변

5

당신은 당신의 결과에 getNodeValue를 호출하고 있으며, this docs 쇼 (표 참조)이 유형 Element의 노드에 대한 null 때문이다. text()을 사용하면 반환 된 세트에 Text 유형의 노드가 포함되므로 원하는 결과 (즉, 요소 ​​자체 대신 제목 요소의 내용)를 얻을 수 있습니다.

xpath에서 text()의 사용에 대한 자세한 내용은 this을 참조하시기 바랍니다.

그리고 당신이 당신의 요소에서 텍스트를 추출 할 경우, 직접, 당신은 getTextContent 대신 getNodeValue 사용할 수 있습니다

// Will work for both element and text nodes 
System.out.println(nodes.item(i).getTextContent()); 
+0

정말 고마워요, 나는 파싱에 빠지기 때문에 나는 여전히 배우고 있습니다. 스택 오버 플로우를 정말 좋아합니다 :) –

1

우선 Xpath 표현이 잘못되었습니다 (필자는 오타라고 생각합니다). 속성은 @으로 표시되므로 올바른 xpath는 /catalog/book[@author='Thurman, Paula']/title/text()이됩니다. 제목 노드가 나중에 표현 The Godfather을 일치합니다 <title>The Godfather</title> 같은 것이 있다면

/catalog/book[@author='Thurman, Paula']/title/는 일치와 /catalog/book[@author='Thurman, Paula']/title/text() 반면에 당신의 XML에서 <title> 즉의 텍스트 노드를 <title> 노드와 일치합니다.

+0

네, 오타, 제 잘못 감사합니다! –

1

제안은 : DOM을 사용하지 마십시오. Java 세계에서 사용 가능한 XML의 트리 표현 (JDOM, XOM, DOM4J)은 DOM보다 훨씬 유용합니다. DOM은 당신이 방금 만났던 것과 같은 gotcha로 가득합니다. 여기에서 요소에 대한 getNodeValue()는 null을 반환합니다. 누구나 DOM을 사용하는 유일한 이유는 (a) 원래 W3C에서 온 것이고 (b) JDK에서 발견 된 것입니다. 그러나 그 모든 일은 오래전에 일어 났으며 사람들은 설계 실수로 배웠습니다.

관련 문제