【转】dom4j 基础入门

本文从以下几个基础的方面介绍dom4j操作XML的使用小结:

  • [一] 读取XML文件 的示例
  • [二] 读取XML字符串 的示例
  • [三] 解析XML的document 的示例
  • [四] XML编码格式转换 的示例
  • [五] 输出格式的自定义 的示例 
  • [六] XML输出文件的示例

 

[一]、读取XML文件:

 

xml示例的文件d:/test/michael/dom4j_info.xml,内容如下:

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <root>  
  3.     <info index="1" type="blog">  
  4.         <URL>http://sjsky.iteye.com</URL>  
  5.         <name id="sjsky">Michael</name>  
  6.         <categories>  
  7.             <category valule="java"/>  
  8.             <category valule="spring"/>  
  9.             <category valule="hibernate"/>  
  10.             <category valule="NoSQL"/>  
  11.             <category valule="MYSQL"/>  
  12.         </categories>  
  13.     </info>  
  14. </root>  

 读取文件的Java代码如下:

Java代码   收藏代码
  1. String fileName = "d:/test/michael/dom4j_info.xml";  
  2. try {  
  3.             SAXReader reader = new SAXReader();  
  4.             Document document = reader.read(new File(fileName));  
  5.             System.out.println("document转化为String输出如下:");  
  6.             System.out.println(document.asXML());  
  7.         } catch (Exception e) {  
  8.             e.printStackTrace();  
  9.         }  

 

运行结果输出如下:代码   收藏代码
  1. document转化为String输出如下:  
  2. <?xml version="1.0" encoding="UTF-8"?>  
  3. <root>  
  4.     <info index="1" type="blog">  
  5.         <URL>http://sjsky.iteye.com</URL>  
  6.         <name id="sjsky">Michael</name>  
  7.         <categories>  
  8.             <category valule="java"/>  
  9.             <category valule="spring"/>  
  10.             <category valule="hibernate"/>  
  11.             <category valule="NoSQL"/>  
  12.             <category valule="MYSQL"/>  
  13.         </categories>  
  14.     </info>  
  15. </root>  

 

ps:一般默认以XML文件中encoding定义的编码格式读取文件 。

 

[二]、读取XML字符串:

 

Java读取String的demo代码:

Java代码   收藏代码
  1. System.out.println("解析XML字符串DEMO");  
  2.  String xmlStr = "<root><info index=\"1\" type=\"blog\">"  
  3.          + "<URL>http://sjsky.iteye.com</URL>"  
  4.          + "<name id=\"sjsky\">Michael</name>"  
  5.          + "<categories><category valule=\"java\"/>"  
  6.          + "<category valule=\"spring\"/><category valule=\"hibernate\"/>"  
  7.          + "<category valule=\"NoSQL\"/><category valule=\"MYSQL\"/>"  
  8.          + "</categories></info></root>";  
  9.  try {  
  10.      Document document = DocumentHelper.parseText(xmlStr);  
  11.      System.out.println("document信息输出,默认为UTF-8的编码:");  
  12.      System.out.println(document.asXML());  
  13.  } catch (Exception e) {  
  14.      e.printStackTrace();  
  15.  }  
运行结果输出如下:
解析XML字符串DEMO
document信息输出,默认为UTF-8的编码:
<?xml version="1.0" encoding="UTF-8"?>
<root><info index="1" type="blog"><URL>http://sjsky.iteye.com</URL><name id="sjsky">Michael</name><categories><category valule="java"/><category valule="spring"/><category valule="hibernate"/><category valule="NoSQL"/><category valule="MYSQL"/></categories></info></root>

ps:1.默认输出编码为UTF-8

      2.输出字符串格式定义参见本文 第[五]部分 

 

[三]、解析XML的Document

 

Java代码   收藏代码
  1. /** 
  2.  * 解析文件 
  3.  * @blog http://sjsky.iteye.com 
  4.  * @param fileName 
  5.  */  
  6. public static void readXMLFile(String fileName) {  
  7.     try {  
  8.         SAXReader reader = new SAXReader();  
  9.         Document document = reader.read(new File(fileName));  
  10.         readXML(document);  
  11.     } catch (Exception e) {  
  12.         e.printStackTrace();  
  13.     }  
  14. }  
  15.   
  16. public static void readXML(Document document) {  
  17.     try {  
  18.         System.out.println("开始解析 XML Document:");  
  19.   
  20.         // 获取跟节点  
  21.         Element rootEle = document.getRootElement();  
  22.         System.out.println("获取跟节点Root:");  
  23.         System.out.println(rootEle.asXML());  
  24.   
  25.         // 根据名称获取Element  
  26.         Element info = rootEle.element("info");  
  27.         System.out.println("获取Root下名称为info的子Element:");  
  28.         System.out.println(info.asXML());  
  29.   
  30.         // 根据名称获取List<Element>  
  31.         List<Element> infolist = rootEle.elements("info");  
  32.         System.out.println("和上面获取的Element应该一致:");  
  33.         System.out.println(infolist.get(0).asXML());  
  34.   
  35.         // 获取属性值  
  36.         System.out.println("获取指定属性type的值 = " + info.attributeValue("type"));  
  37.   
  38.         // 获取所有的属性值  
  39.         for (int i = 0; i < info.attributeCount(); i++) {  
  40.             System.out.println("获取所有的属性和值: " + info.attribute(i).getName()  
  41.                     + " = " + info.attribute(i).getValue());  
  42.         }  
  43.         // XPath的功能展示  
  44.   
  45.         Node node1 = document.selectSingleNode("/root/info/name");  
  46.         System.out.println("根据XPath=/root/info/name获取document下的ELement : "  
  47.                 + node1.asXML());  
  48.   
  49.         Node node2 = rootEle.selectSingleNode("info/name");  
  50.         System.out.println("根据XPath=info/name      获取root下的ELement     : "  
  51.                 + node2.asXML());  
  52.   
  53.         Node node3 = rootEle.selectSingleNode("//info/name");  
  54.         System.out.println("根据XPath=//info/name    获取root下的ELement     : "  
  55.                 + node3.asXML());  
  56.         System.out.println("上述三种方式获取的结果应该是一致");  
  57.   
  58.         List<?> nodeList = rootEle  
  59.                 .selectNodes("//info/categories/category");  
  60.         System.out  
  61.                 .println("根据XPath=//info/categories/category获取root下的List:");  
  62.         for (int i = 0; i < nodeList.size(); i++) {  
  63.             System.out.println(((Element) nodeList.get(i)).asXML());  
  64.         }  
  65.   
  66.     } catch (Exception e) {  
  67.         e.printStackTrace();  
  68.     }  
  69. }  
  
运行结果如下:代码   收藏代码
  1. 开始解析 XML Document:  
  2. 获取跟节点Root:  
  3. <root>  
  4.     <info index="1" type="blog">  
  5.         <URL>http://sjsky.iteye.com</URL>  
  6.         <name id="sjsky">Michael</name>  
  7.         <categories>  
  8.             <category valule="java"/>  
  9.             <category valule="spring"/>  
  10.             <category valule="hibernate"/>  
  11.             <category valule="NoSQL"/>  
  12.             <category valule="MYSQL"/>  
  13.         </categories>  
  14.     </info>  
  15. </root>  
  16. 获取Root下名称为info的子Element:  
  17. <info index="1" type="blog">  
  18.         <URL>http://sjsky.iteye.com</URL>  
  19.         <name id="sjsky">Michael</name>  
  20.         <categories>  
  21.             <category valule="java"/>  
  22.             <category valule="spring"/>  
  23.             <category valule="hibernate"/>  
  24.             <category valule="NoSQL"/>  
  25.             <category valule="MYSQL"/>  
  26.         </categories>  
  27.     </info>  
  28. 和上面获取的Element应该一致:  
  29. <info index="1" type="blog">  
  30.         <URL>http://sjsky.iteye.com</URL>  
  31.         <name id="sjsky">Michael</name>  
  32.         <categories>  
  33.             <category valule="java"/>  
  34.             <category valule="spring"/>  
  35.             <category valule="hibernate"/>  
  36.             <category valule="NoSQL"/>  
  37.             <category valule="MYSQL"/>  
  38.         </categories>  
  39.     </info>  
  40. 获取指定属性type的值 = blog  
  41. 获取所有的属性和值: index = 1  
  42. 获取所有的属性和值: type = blog  
  43. 根据XPath=/root/info/name获取document下的ELement : <name id="sjsky">Michael</name>  
  44. 根据XPath=info/name      获取root下的ELement     : <name id="sjsky">Michael</name>  
  45. 根据XPath=//info/name    获取root下的ELement     : <name id="sjsky">Michael</name>  
  46. 上述三种方式获取的结果应该是一致  
  47. 根据XPath=//info/categories/category获取root下的List:  
  48. <category valule="java"/>  
  49. <category valule="spring"/>  
  50. <category valule="hibernate"/>  
  51. <category valule="NoSQL"/>  
  52. <category valule="MYSQL"/>  

ps:1. XPath的使用依赖lib包:jaxen.jar

      2. XPath的简单介绍说明(以后有机会做个详细介绍)

  •  nodename 选取此节点的所有子节点(相对路径)
  • / 从根节点选取(绝对路径)         
  • // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
  • .  选取当前节点
  • .. 选取当前节点的父节点
  • @  选取属性

 

[四]、XML编码格式转换:

Java代码   收藏代码
  1. /** 
  2.  * @blog http://sjsky.iteye.com 
  3.  * @param args 
  4.  */  
  5. public static void main(String[] args) {  
  6.   
  7.     String xmlStr = "<root><info index=\"1\" type=\"blog\">"  
  8.             + "<URL>http://sjsky.iteye.com</URL>"  
  9.             + "<name id=\"sjsky\">Michael</name>"  
  10.             + "<categories><category valule=\"java\"/>"  
  11.             + "<category valule=\"spring\"/><category valule=\"hibernate\"/>"  
  12.             + "<category valule=\"NoSQL\"/><category valule=\"MYSQL\"/>"  
  13.             + "</categories></info></root>";  
  14.   
  15.     System.out.println("XML编码转化DEMO");  
  16.     try {  
  17.         Document document = DocumentHelper.parseText(xmlStr);  
  18.         System.out.println("默认为UTF-8的编码,输出内容如下:");  
  19.         System.out.println(document.asXML());  
  20.         System.out.println("编码转化为gb2312后,输出内容如下:");  
  21.         String encodeStr = encodeXml(xmlStr, "gb2312");  
  22.         System.out.println(encodeStr);  
  23.   
  24.     } catch (Exception e) {  
  25.         e.printStackTrace();  
  26.     }  
  27.     System.out.println("DEMO End---------------------");  
  28. }  

 

运行结果如下:代码   收藏代码
  1. XML编码转化DEMO  
  2. 默认为UTF-8的编码,输出内容如下:  
  3. <?xml version="1.0" encoding="UTF-8"?>  
  4. <root><info index="1" type="blog"><URL>http://sjsky.iteye.com</URL><name id="sjsky">Michael</name><categories><category valule="java"/><category valule="spring"/><category valule="hibernate"/><category valule="NoSQL"/><category valule="MYSQL"/></categories></info></root>  
  5. 编码转化为gb2312后,输出内容如下:  
  6. <?xml version="1.0" encoding="gb2312"?>  
  7.   
  8. <root>  
  9.   <info index="1" type="blog">  
  10.     <URL>http://sjsky.iteye.com</URL>  
  11.     <name id="sjsky">Michael</name>  
  12.     <categories>  
  13.       <category valule="java"/>  
  14.       <category valule="spring"/>  
  15.       <category valule="hibernate"/>  
  16.       <category valule="NoSQL"/>  
  17.       <category valule="MYSQL"/>  
  18.     </categories>  
  19.   </info>  
  20. </root>  
  21.   
  22. DEMO End---------------------  

 

[五]、XML输出格式的定义:

 

  • OutputFormat compactFormat = OutputFormat.createCompactFormat(); 紧凑的格式
  • OutputFormat prettyFormat = OutputFormat.createPrettyPrint(); 优雅具有层次的格式

 

Java代码   收藏代码
  1. /** 
  2.  * @blog http://sjsky.iteye.com 
  3.  * @param args 
  4.  */  
  5. public static void main(String[] args) {  
  6.     String xmlStr = "<root><info index=\"1\" type=\"blog\">"  
  7.             + "<URL>http://sjsky.iteye.com</URL>"  
  8.             + "<name id=\"sjsky\">Michael</name>"  
  9.             + "<categories><category valule=\"java\"/>"  
  10.             + "<category valule=\"spring\"/><category valule=\"hibernate\"/>"  
  11.             + "<category valule=\"NoSQL\"/><category valule=\"MYSQL\"/>"  
  12.             + "</categories></info></root>";  
  13.   
  14.     System.out.println("XML输出格式定义Demo:");  
  15.     try {  
  16.         Document document = DocumentHelper.parseText(xmlStr);  
  17.         System.out.println("转换为优雅层次的格式输出:");  
  18.         OutputFormat prettyFormat = OutputFormat.createPrettyPrint();  
  19.         String xmlPretty = xmlOutputFormat(document, prettyFormat);  
  20.         System.out.println(xmlPretty);  
  21.   
  22.         System.out.println("转换为紧凑格式输出:");  
  23.         OutputFormat compactFormat = OutputFormat.createCompactFormat();  
  24.         String xmlCompact = xmlOutputFormat(document, compactFormat);  
  25.         System.out.println(xmlCompact);  
  26.     } catch (Exception e) {  
  27.         e.printStackTrace();  
  28.     }  
  29.   
  30.     System.out.println("DEMO End---------------------");  
  31. }  
  32.   
  33. /** 
  34.  * XML 输出格式转换 
  35.  * @param document 
  36.  * @param opFormat 
  37.  * @return String 
  38.  */  
  39. public static String xmlOutputFormat(Document document,  
  40.         OutputFormat opFormat) {  
  41.     // 具有层次的格式输出  
  42.     // OutputFormat format = OutputFormat.createPrettyPrint();  
  43.     // 紧凑的格式输出  
  44.     // OutputFormat format = OutputFormat.createCompactFormat();  
  45.     StringWriter sw = new StringWriter();  
  46.     try {  
  47.         XMLWriter writer = new XMLWriter(opFormat);  
  48.         writer.setWriter(sw);  
  49.         writer.write(document);  
  50.     } catch (Exception e) {  
  51.         e.printStackTrace();  
  52.     }  
  53.     return sw.toString();  
  54. }  

 

运行结果输出如下:代码   收藏代码
  1. XML输出格式定义Demo:  
  2. 转换为优雅层次的格式输出:  
  3. <?xml version="1.0" encoding="UTF-8"?>  
  4.   
  5. <root>  
  6.   <info index="1" type="blog">  
  7.     <URL>http://sjsky.iteye.com</URL>  
  8.     <name id="sjsky">Michael</name>  
  9.     <categories>  
  10.       <category valule="java"/>  
  11.       <category valule="spring"/>  
  12.       <category valule="hibernate"/>  
  13.       <category valule="NoSQL"/>  
  14.       <category valule="MYSQL"/>  
  15.     </categories>  
  16.   </info>  
  17. </root>  
  18.   
  19. 转换为紧凑格式输出:  
  20. <?xml version="1.0" encoding="UTF-8"?>  
  21. <root><info index="1" type="blog"><URL>http://sjsky.iteye.com</URL><name id="sjsky">Michael</name><categories><category valule="java"/><category valule="spring"/><category valule="hibernate"/><category valule="NoSQL"/><category valule="MYSQL"/></categories></info></root>  
  22. DEMO End---------------------  

 

[六]、XML输出文件:

 

Java代码   收藏代码
  1. /** 
  2.  * @blog http://sjsky.iteye.com 
  3.  * @author Michael 
  4.  * @param args 
  5.  */  
  6. public static void main(String[] args) {  
  7.     String xmlStr = "<root><info index=\"1\" type=\"blog\">"  
  8.             + "<URL>http://sjsky.iteye.com</URL>"  
  9.             + "<name id=\"sjsky\">Michael</name>"  
  10.             + "<categories><category valule=\"java\"/>"  
  11.             + "<category valule=\"spring\"/><category valule=\"hibernate\"/>"  
  12.             + "<category valule=\"NoSQL\"/><category valule=\"MYSQL\"/>"  
  13.             + "</categories></info></root>";  
  14.   
  15.     System.out.println("XML输出文件:");  
  16.     String outFileName = "d:/test/michael/";  
  17.     try {  
  18.         Document document = DocumentHelper.parseText(xmlStr);  
  19.         xmlWriteXMLDoc(outFileName+"dom4j_info_out1.xml", document);  
  20.           
  21.         fileWriteXMLDoc(outFileName+"dom4j_info_out2.xml", document);  
  22.           
  23.     } catch (Exception e) {  
  24.         e.printStackTrace();  
  25.     }  
  26.   
  27.     System.out.println("DEMO End---------------------");  
  28. }  
  29.   
  30. /** 
  31.  *  
  32.  * @param fileName 
  33.  * @param document 
  34.  */  
  35. public static void xmlWriteXMLDoc(String fileName, Document document) {  
  36.     XMLWriter writer = null;  
  37.     try {  
  38.         //writer = new XMLWriter(new FileWriter(fileName));  
  39.         //writer = new XMLWriter(new FileWriter(fileName),OutputFormat.createCompactFormat());  
  40.         writer = new XMLWriter(new FileWriter(fileName),OutputFormat.createPrettyPrint());  
  41.         writer.write(document);  
  42.   
  43.     } catch (Exception e) {  
  44.         e.printStackTrace();  
  45.     } finally {  
  46.         try {  
  47.             if (null != writer) {  
  48.                 writer.close();  
  49.             }  
  50.         } catch (Exception e) {  
  51.             e.printStackTrace();  
  52.         }  
  53.     }  
  54. }  
  55.   
  56. /** 
  57.  *  
  58.  * @param fileName 
  59.  * @param document 
  60.  */  
  61. public static void fileWriteXMLDoc(String fileName, Document document) {  
  62.     FileWriter fw = null;  
  63.     try {  
  64.         fw = new FileWriter(fileName);  
  65.         document.write(fw);  
  66.     } catch (Exception e) {  
  67.         e.printStackTrace();  
  68.     } finally {  
  69.         try {  
  70.             if (null != fw) {  
  71.                 fw.close();  
  72.             }  
  73.         } catch (Exception e) {  
  74.             e.printStackTrace();  
  75.         }  
  76.     }  
  77. }  

 

生成的dom4j_info_out1.xml文件内容如下:

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <root>  
  4.   <info index="1" type="blog">  
  5.     <URL>http://sjsky.iteye.com</URL>  
  6.     <name id="sjsky">Michael</name>  
  7.     <categories>  
  8.       <category valule="java"/>  
  9.       <category valule="spring"/>  
  10.       <category valule="hibernate"/>  
  11.       <category valule="NoSQL"/>  
  12.       <category valule="MYSQL"/>  
  13.     </categories>  
  14.   </info>  
  15. </root>  

 

生成的dom4j_info_out2.xml文件内容如下:

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <root><info index="1" type="blog"><URL>http://sjsky.iteye.com</URL><name id="sjsky">Michael</name><categories><category valule="java"/><category valule="spring"/><category valule="hibernate"/><category valule="NoSQL"/><category valule="MYSQL"/></categories></info></root>  

到此有关dom4j的简单应用基本介绍完了,希望给新接触的tx有所帮助。

 

 

 

本文连接:http://sjsky.iteye.com/blog/1239872

 

 

转载请注明来自:Michael's blog @ http://sjsky.iteye.com 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值