2011-08-05 24 views
0

我正在上發青的Web應用程序中的XML使用XPath鏈接場!框架。 我必須解析一個XML文檔。我使用Play.libs的XPath。解析原子:從Play.libs

這裏是一片文件的,我沒有成功檢索:

<atom:link rel="self" href="http://mylink.com/"> 

而且一段代碼我寫的。

import java.util.Map; 
import java.util.HashMap; 
import org.w3c.dom.*;  
import play.libs.XPath; 
import play.libs.WS; 
import play.libs.ws.*; 

WS.HttpResponse response = // I retrieve a Http response 
Document xmlDoc = response.getXml(); 
Map<String,String> namespaces = new HashMap<String,String>(){{put("atom", "http://www.w3.org/2005/Atom");}} 
Node link = XPath.selectNode("atom:link", xmlDoc, namespaces) 

我也試過

Node link = XPath.selectNode("link", xmlDoc, namespaces) 

失敗和返回null。

編輯: 我在網頁(here)上發現此問題可能來自DocumentBuilder(文檔不知道名稱空間)。但是我沒有構建它,這是Openstack Compute API中的一個非常規的反應。這意味着我無法控制它的構建方式。

如果你想看到完整的XML文檔

here

EDIT2: 看起來像我有一個「沒有名稱空間感知的問題」,任何建議,以避免這個問題?

+0

是您參考文檔完整的文件或文件? –

+0

這是一個文件。這是一個寫得很好的XML文檔,我無法控制。 – yco

回答

0

注意,XPath表達式是相對於上下文,你的情況文檔節點。您的表達式選擇所有<原子:鏈接>屬於文檔的直接子元素(和,當然,沒有任何)。您需要指定所需的原子鏈接元素的完整路徑,或使用某個唯一標識它的謂詞。

"/os:servers/os:server[1]/atom:link[rel='self']" 

將選擇一個<原子:與包含在第一<服務器>元素的rel =自鏈接>元素。

UPDATE:

如果您有沒有命名空間問題,

xmlDoc.getRootElement.getNamespaceURI() 

應該返回null。在這種情況下,使用上面錯誤報告中找到的測試代碼很容易。

+0

謝謝你的迴應。但我得到這個錯誤:無法解析命名空間前綴'os'。看起來我必須創建一個新的命名空間。 – yco

+0

是的,你需要添加綁定os - > http://docs.openstack.org/compute/api/v1.1 –

+0

作爲另一個hashmap?試圖把(「os」,「docs.openstack.org/compute/api/v1.1」);也沒有成功 – yco

0

對於那些誰已經或將有同樣的問題,我在這裏寫我選擇的解決方案。

由於問題來自於文檔構建,以及功能的getXML不設置文檔意識到命名空間,你必須更換功能。

代碼從lighthouse

public Document getXml(HttpResponse response, String encoding) { 
    try { 
     InputSource source = new InputSource(response.getStream()); 
     source.setEncoding(encoding); 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     factory.setNamespaceAware(true); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     builder.setEntityResolver(new NoOpEntityResolver()); 
     return builder.parse(source); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

,取而代之的檢索您的DOM文檔這樣的:

Document doc = WS.url("http://www.yoursource.com").get().getXml(); 

您應該改用:

getXml(WS.url("http://www.yoursource.com").get(),"UTF-8");