2012-12-27 90 views
0
final SAXBuilder builder = new SAXBuilder(); 
final Document xml = builder.build(file); 
final Element root = (Element) xml.getRootElement(); 
Element child = root.getChild("Header", Namespace.getNamespace("http://www.editeur.org/icedis/claims")); 
final XPathContext ctx = XPathContext.create(root); 

這是我的代碼。 XPathContext只是JXPathContext的封裝。正如你看到的,使用名字空間構造的'child'變量,如果我刪除它,它將不起作用。如何在指定xmlns的情況下使用JXPathContext獲取值?

但現在我想從XML獲得價值使用XPath這樣

ctx.getValue("/Header/SentDateTime") 

而且着,當然它總是返回null。看來解決方案很簡單,但我無法在互聯網上找到它。如果我從XML文件中刪除xmlns,一切都會起作用,但這不是一個選項。那麼我應該如何使用這個XML?

另外,XML文件的短版:

<?xml version="1.0" encoding="UTF-8"?> 
<ICEDISClaimMessage version="0.1" xmlns="http://www.editeur.org/icedis/claims"> 
    <Header> 
     <Sender> 
      <SenderIdentifier> 
       <SenderIDType>06</SenderIDType> 
       <IDValue>1234567890128</IDValue> 
      </SenderIdentifier> 
      <SenderName>Apogee Agency</SenderName> 
     </Sender> 
     <Addressee> 
      <AddresseeIdentifier> 
       <AddresseeIDType>06</AddresseeIDType> 
       <IDValue>23456789</IDValue> 
      </AddresseeIdentifier> 
     </Addressee> 
     <MessageNumber>111</MessageNumber> 
     <SentDateTime>20101001</SentDateTime> 
     <MessageNote>Sample file 1: a claim made by an agent to a publisher for a journal issue not yet delivered</MessageNote> 
    </Header> 
</<ICEDISClaimMessage> 

回答

0

您需要使用XPath表達式與命名空間上下文。它必須是這個樣子:

final XPathContext ctx = XPathContext.create(root); 
ctx.addNamespaceMapping("ns", "http://www.editeur.org/icedis/claims"); 
... = ctx.getValue("/ns:Header/ns:SentDateTime"); 

注:我不知道是否的JXPath支持命名空間,如果是的話,它是如何成立。

順便說一句,它看起來像你使用的是JDOM(SAXBuilder)。在這種情況下,我會建議使用構建在XPath函數中的JDOM而不是構建包裝器。

相關問題