2011-08-27 5 views
0

누군가가 왜 이런 일이 발생했는지 설명해주세요.Xpath를 사용하여 DOM 하위 트리의 모든 속성을 가져 옵니까?

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
"<title text=\"title1\">\n" + 
" <comment id=\"comment1\">\n" + 
"  <data> abcd </data>\n" + 
"  <data> efgh </data>\n" + 
" </comment>\n" + 
" <comment id=\"comment2\">\n" + 
"  <data> ijkl </data>\n" + 
"  <data> mnop </data>\n" + 
"  <data> qrst </data>\n" + 
" </comment>\n" + 
"</title>\n"; 

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc = builder.parse(new InputSource(new StringReader(xml))); 
NodeList nlist = doc.getElementsByTagName("comment"); 

XPathFactory xpf = XPathFactory.newInstance(); 
XPath xp = xpf.newXPath(); 
NodeList nodes = (NodeList)xp.evaluate("//@*", nlist.item(0), XPathConstants.NODESET); 
for(int i = 0; i < nodes.getLength(); i++) 
    System.out.println(nodes.item(i)); 

생성되는 출력은 다음과 같습니다 :이 다음 내가있어 코드, 난 하위 트리에 XPath 쿼리를 (어떻게하려고

text="title1" 
id="comment1" 
id="comment2" 

문제는 즉, 첫 번째 comment 블록),이 서브 트리의 모든 속성이 인 이 되길 원하지만 어떤 이유로 하위 트리를 전달할 때 항상 의 모든 속성 노드를 반환합니다. 객체가 xpath로 전달되는 것처럼 평가자는 루트 노드입니다.

하위 트리에 대한 모든 속성을 전달하고 평가할 수 있습니까?

답변

2

XPath 표현식에서 //를 생략해야합니다.

NodeList nodes = (NodeList)xp.evaluate("@*", nlist.item(0), XPathConstants.NODESET); 
+0

우수! 이게 어떻게 작동하는지 설명해 주시겠습니까? – Larry

관련 문제