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

困扰我几周的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>001ReqId>  
  5.     <Tid>1002Tid>  
  6.     <Cid>500Cid>  
  7.     <user>cuishenuser>  
  8.     <Mname>supermarketMname>    
  9.     <pwd>543200210pwd>  
  10. Hdr>  
  11. <Car>  
  12.     <Flg>TFlg>  
  13.     <Cod>cccCod>  
  14.     <Door>kkkDoor>  
  15.     <mktId>b01mktId>  
  16.     <Key>  
  17.         <KeyID>t01KeyID>  
  18.     Key>  
  19. Car>  
  20. MyXML>  

 

下面是用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. }   

 

上面就是运用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>  

 

解析上面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. }   

 

 

你可能感兴趣的:(XML)