解决dom4j无法解析xml命名空间的问题

来源:互联网 发布:matlab怎么导入数据 编辑:程序博客网 时间:2024/05/21 15:51

 困扰我几周的dom4j无法解析xml命名空间的问题近日得以解决,如果这个问题也正在困扰你,看看下文也许能给你一些启发

xml文件----myXML.xml

  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <MyXML xmlns="http://www.ttt.com/ttt-TrdInfo-1-0" xmlns:x="http://www.ttt.com/ttt/metadata.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="res286.xsd">   
  3. <Hdr>   
  4.     <ReqId>001</ReqId>   
  5.     <Tid>1002</Tid>   
  6.     <Cid>500</Cid>   
  7.     <user>cuishen</user>   
  8.     <Mname>supermarket</Mname>    
  9.     <pwd>543200210</pwd>   
  10. </Hdr>   
  11. <Car>   
  12.     <Flg>T</Flg>   
  13.     <Cod>ccc</Cod>   
  14.     <Door>kkk</Door>   
  15.     <mktId>b01</mktId>   
  16.     <Key>   
  17.         <KeyID>t01</KeyID>   
  18.     </Key>   
  19. </Car>   
  20. </MyXML>  
  21. 下面是用dom4j解析上面xml文件的java源文件

    ---ReadMyXML.java
  1. import java.io.File;   
  2. import java.util.List;   
  3. import java.util.Map;   
  4. import java.util.HashMap;   
  5.   
  6. import org.dom4j.Document;   
  7. import org.dom4j.Element;   
  8. import org.dom4j.XPath;   
  9. import org.dom4j.Attribute;   
  10. import org.dom4j.io.SAXReader;   
  11. import org.dom4j.DocumentException;   
  12.   
  13. public class ReadMyXML{   
  14.     public static void main(String args[]){   
  15.         File xmlFile = new File("c:/myXML.xml");   
  16.         SAXReader xmlReader = new SAXReader();   
  17.         try{   
  18.             Document document = xmlReader.read(xmlFile);   
  19.             ///*测试代码    适用于读取xml的节点   
  20.             HashMap xmlMap = new HashMap();   
  21.             xmlMap.put("mo","http://www.ttt.com/ttt-TrdInfo-1-0");   
  22.             XPath x = document.createXPath("//mo:ReqId");   
  23.             x.setNamespaceURIs(xmlMap);            
  24.             Element valueElement = (Element)x.selectSingleNode(document);   
  25.             System.out.println(valueElement.getText());   
  26.             //*/   
  27.         }catch(DocumentException e){   
  28.             e.printStackTrace();   
  29.         }   
  30.     }   
  31. }  
  32. 上面就是运用dom4j解析带命名空间的xml文件的节点的例子,只要给XPath设置默认的命名空间就行了,这个xml文件尽管定义了其他命名空间,但是没有用到它,所以不必管它,那个HashMap里的键是随便定义的字符串,值就是默认的命名空间对应的字符串。document.createXPath()里传的参数是要读取的节点的XPath,即“//”+ HashMap里的键名 + “:”+ 要读取的节点名组成的字符串,简单吧,后面怎么做我就不用说了吧^_^
    如果要读取的是xml文件里的属性该怎么办呢,不用急,看看下面的例子你就明白了,原理一样,只要在造XPath字符串的时候在属性前加个“@”就行了。

    xml文件----myXML2.xml
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <MyXML xmlns="http://www.ttt.com/ttt-TrdInfo-1-0" xmlns:x="http://www.ttt.com/ttt/metadata.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="res286.xsd">   
  3. <Hdr ReqId="001" Tid="1002" Cid="500" user="cuishen" Mname="supermarket" pwd="543200210"/>   
  4. <Car Flg="T" Cod="ccc" Door="kkk" mktId="b01">   
  5. <Key KeyID="t01"/>   
  6. </Car>   
  7. </MyXML>  
  8. 解析上面xml文件的java文件如下
    ---ReadMyXML2.java
  1. import java.io.File;   
  2. import java.util.List;   
  3. import java.util.Map;   
  4. import java.util.HashMap;   
  5.   
  6. import org.dom4j.Document;   
  7. import org.dom4j.Element;   
  8. import org.dom4j.XPath;   
  9. import org.dom4j.Attribute;   
  10. import org.dom4j.io.SAXReader;   
  11. import org.dom4j.DocumentException;   
  12.   
  13. public class ReadMyXML2{   
  14.     public static void main(String args[]){   
  15.         File xmlFile = new File("c:/myXML2.xml");   
  16.         SAXReader xmlReader = new SAXReader();   
  17.         try{   
  18.             Document document = xmlReader.read(xmlFile);   
  19.             ///*测试代码  解析xml的属性   
  20.             HashMap xmlMap = new HashMap();   
  21.             xmlMap.put("mo","http://www.ttt.com/ttt-TrdInfo-1-0");   
  22.             XPath x = document.createXPath("//mo:Hdr/@ReqId");   
  23.             x.setNamespaceURIs(xmlMap);   
  24.             Attribute valueAttribute = (Attribute)x.selectSingleNode(document);   
  25.             System.out.println(valueAttribute.getText());   
  26.             //*/   
  27.         }catch(DocumentException e){   
  28.             e.printStackTrace();   
  29.         }   
  30.     }   
  31. }  
  32. 转自:http://cuishen.javaeye.com/blog/36054
原创粉丝点击