2011-12-30 3 views
2

나는 다음과 같은 XML이 :자바 XPath는 표현

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<application xmlns="http://research.sun.com/wadl/2006/10"> 
<doc xmlns:jersey="http://jersey.dev.java.net/" 
    jersey:generatedBy="Jersey: 1.0.2 02/11/2009 07:45 PM"/> 
<resources base="http://localhost:8080/stock/"> 
    <resource path="categories"> (<<---I want to get here) 
     <method id="getCategoriesResource" name="GET"> 

을 내가 resource/@path의 값을 얻으려면 그래서 나는 다음과 같은 자바 코드가이 XPath 식 결과와

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
factory.setNamespaceAware(true); // never forget this! 
DocumentBuilder builder = factory.newDocumentBuilder(); 
// get the xml to parse from URI 
Document doc = builder.parse(serviceUri + "application.wadl"); 
XPathFactory xfactory = XPathFactory.newInstance(); 
XPath xpath = xfactory.newXPath(); 
XPathExpression expression = 
     xpath.compile("/application/resources/resource/@path"); 
this.baseUri = (String) expression.evaluate(doc, XPathConstants.STRING); 

을 (baseUri)는 항상 빈 문자열 ("")입니다.

+0

내가 더 XPath에 전문가는 아니지만, 당신은 단지 attribute''@와 속성을 해결하지? 당신은'/ @ path'를 가지고 있습니다. '/ application/resources/resource @ path'을 시도해보십시오. – Thomas

+2

/application/resources/resource/@ path는 속성 – RanRag

답변

5

노드가 빈 문자열 네임 스페이스에 없으므로 노드 이름을 /wadl:application/wadl:resources/wadl:resource/@path으로 지정해야합니다. 또한 XPath 엔진 네임 스페이스 컨텍스트에 네임 스페이스를 등록해야합니다.

이 작동 예 :

xpath.setNamespaceContext(new NamespaceContext() 
    { 
     @Override 
     public String getNamespaceURI(final String prefix) 
     { 
      if(prefix.equals("wadl")) 
       return "http://research.sun.com/wadl/2006/10"; 
      else 
       return null; 
     } 

     @Override 
     public String getPrefix(final String namespaceURI) 
     { 
      throw new UnsupportedOperationException(); 
     } 

     @Override 
     public Iterator getPrefixes(final String namespaceURI) 
     { 
      throw new UnsupportedOperationException(); 
     } 
    }); 
    XPathExpression expression = xpath.compile("/wadl:application/wadl:resources/wadl:resource/@path"); 
+0

을 주소 지정하는 올바른 방법입니다. 노드가 * no * 네임 스페이스에 없다는 것을 의미합니다. * default * 네임 스페이스에 * 있습니다. –

+0

@lwburk 고정되었습니다. – kan