2014-01-23 50 views
0

更新:GET值:noNamespaceSchemaLocation(XPATH)

我想獲得在XSI的arritbute的價值:noNamespaceSchemaLocation,即: 「http://www.mypage/pagedescription.xsd

<link 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="http://www.mypage/pagedescription.xsd"> 


... 
... 

鏈接是在我的XML文件中的元素(接近頂部)

然而,XPATH // N:鏈接/ @ XSI:no​​NamespaceSchemaLocation不起作用

我試圖修改的背景,但它仍然無法正常工作

@Override 
public Object executeXpathQuery(Document domDoc, String strQuery) throws Exception { 


    System.out.println("executeXpathQuery : strQuery:" + strQuery); 

    // output: executeXpathQuery: strQuery://n:link/@xsi:noNamespaceSchemaLocation 
    // so far, it looks OK 

    XPathFactory xpf = XPathFactory.newInstance(); 
    XPath xPath = xpf.newXPath(); 

    final String nonameNamespace = domDoc.getFirstChild().getNamespaceURI(); 

    NamespaceContext ctx = new NamespaceContext() { 
     public String getNamespaceURI(String prefix) { 

      String uri = null; 
      if ("n".equals(prefix)) { 
       System.out.println("using prefix"); 
       uri = nonameNamespace; 
      } 
      else if ("xsi".equals(prefix)) { 
       uri = "http://www.w3.org/2001/XMLSchema-instance"; 
      } 
      return null; 
     } 
     public String getPrefix(String uri) { 
      throw new UnsupportedOperationException(); 
     } 
     public Iterator getPrefixes(String uri) { 
      throw new UnsupportedOperationException(); 
     } 
    }; 


    xPath.setNamespaceContext(ctx); 

    XPathExpression xPathExp = xPath.compile(strQuery); 


    return (Node) xPathExp.evaluate(domDoc,XPathConstants.NODE); 

} 

而且我做了docuùent建設者意識到上下文:

static DocumentBuilder getDocumentBuilder() { 
    DocumentBuilderFactory dbf; 
    DocumentBuilder db; 

    db = null; 

    try { 
     dbf = DocumentBuilderFactory.newInstance(); 
     dbf.setNamespaceAware(true); 
     db = dbf.newDocumentBuilder(); 
    } catch (ParserConfigurationException e) { 
     LogMes.log(XMLFactoryServiceImpl.class, LogMes.ERROR, "Erreur lors de la cràation d'un document DOM. Message: " + e.getMessage()); 
    } 
    return db; 
} 

我得到「使用前綴」在輸出=>這部分流行OK 我仍然得到一個空值

任何想法?

回答

2

你是那裏的路99%,你只需要讓你的NamespaceContext返回正確的事情爲xsi前綴:

public String getNamespaceURI(String prefix) { 

     String uri = null; 
     if ("n".equals(prefix)) { 
      System.out.println("using prefix"); 
      uri = nonameNamespace; 
     } else if ("xsi".equals(prefix)) { 
      uri = "http://www.w3.org/2001/XMLSchema-instance"; 
     } 
     return uri; 
    } 

另外,如果您通過使用DocumentBuilder解析XML創建domDoc那麼您必須通過在.newDocumentBuilder()之前調用docBuilderFactory.setNamespaceAware(true)來確保構建器具有名稱空間感知功能。對於我只能假設的歷史原因,DBF的默認值是解析而不是處理名稱空間,而這樣的DOM樹不能用於XPath。

+0

我已考慮到您提出的修改,但我仍收到空白。不過,非常感謝您的好意! – stackSaru

+0

@ user3166206是名稱空間中的link元素本身(即是否有一個具有默認'xmlns =「...」聲明的祖先元素)?如果是這樣的話,你可能需要XPath中的'n:link'而不是'link'。 –