2011-12-30 4 views
2

У меня есть следующий XML:Java 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 поэтому у меня есть следующий Java-код:

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); 

С помощью этого XPath выражения результата (baseUri) всегда является пустой строкой ("").

+0

Я не эксперт XPath, но не адрес атрибутов с '@ attribute' только? У вас есть '/ @ путь'. Попробуйте '/ 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 *. Они * являются * в пространстве имен * по умолчанию *. –

+0

@ lwburk Исправлено – kan

Смежные вопросы