转: dom4j中使用xpath解析带命名空间的xml文件,取不到节点的解决办法

哎 基础不扎实啊~~~ DOM4J取了一个小时没取出来  郁闷坏了。。
引用

使用 DOM4J 的xpath 非常方便,但是,直接使用xpath 取带命名空间的xm文件,会出现取不到节点的问题.具体问题如下
Xml文档代码 
  
zscasvgsadg  
sdvgsdvsaddzsfbnzsdfbvdas  
0pMmg6  
  
1306663476453admin38  
NOR  
60  
  
  



  如果想取

  identify 的值:  使用xpath expression : “/message/ext/identify ”  将不能取到值

  取x的属性值  :  使用xpath  expression: “/message/ext/identify/x/@var “;  也不能取到x var 的属性值


  那么该怎么做了,直接上代码:
Java代码 

public static MessageNode getNode1(String msg)  
throws DocumentException  
 {  
    SAXReader reader = new SAXReader();  
    Document document = reader.read(new StringReader(msg));  
    XPath xPath = document.createXPath("/message/a:ext/a:identify");  
    Map names = new HashMap();  
    names.put("a", "infoair:obcs:msg:ext");  
               MessageNode messageNode = new MessageNode();  
    xPath.setNamespaceURIs(names);  
    Node node = xPath.selectSingleNode(document);  
    messageNode.setIdentify(node.getText());  
    xPath = document.createXPath("/message/a:ext/b:x/@var");  
    names.put("b", "infoair:obcs:msg:source");  
    xPath.setNamespaceURIs(names);  
    node = xPath.selectSingleNode(document);  
    messageNode.setParentId(node.getText());  
    return messageNode;  
}  
 


names.put("a", "infoair:obcs:msg:ext");  


   只要 xpath 选择时,加上命名空间就行了

    "a "  表示前缀,"infoair:obcs:msg:ext "  表示命名空间。


具体原因,请见:
XML 命名空间以及它们如何影响 XPath 和 XSLT (Extreme XML)
 


原文出处 http://beautyofprogram.iteye.com/blog/1138508

你可能感兴趣的:(xpath,dom4j)