增强Dom4j--让XML处理更容易

简介:
Java处理XML的工具包中,Dom4j是佼佼者,但是使用起来还是不够简洁。
为更方便使用Dom4j处理XML,这里做了一些工具类库,放出来以供参考。
 
一、文件与字符串相互转换的工具
处理XML文件读取的问题,实际上这个是一个文本文件读取的问题。
 
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import java.io.*; 

/** 
* 字符串与文件相互转换工具 

* @author leizhimin 2009-11-11 15:54:18 
*/
 
public  class StringFileToolkit { 
         private  static Log log = LogFactory.getLog(StringFileToolkit. class); 

         /** 
         * 读取输入流为一个内存字符串,保持文件原有的换行格式 
         * 
         * @param in            输入流 
         * @param charset 文件字符集编码 
         * @return 文件内容的字符串 
         */
 
         public  static String file2String(InputStream in, String charset) { 
                StringBuffer sb =  new StringBuffer(); 
                 try { 
                        LineNumberReader reader =  new LineNumberReader( new BufferedReader( new InputStreamReader(in, charset))); 
                        String line; 
                         while ((line = reader.readLine()) !=  null) { 
                                sb.append(line).append(System.getProperty( "line.separator")); 
                        } 
                        reader.close(); 
                }  catch (UnsupportedEncodingException e) { 
                        log.error( "读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + charset, e); 
                }  catch (IOException e) { 
                        log.error( "读取文件为一个内存字符串失败,失败原因是读取文件异常!", e); 
                } 
                 return sb.toString(); 
        } 

         /** 
         * 读取文件为一个内存字符串,保持文件原有的换行格式 
         * 
         * @param file        文件对象 
         * @param charset 文件字符集编码 
         * @return 文件内容的字符串 
         */
 
         public  static String file2String(File file, String charset) { 
                StringBuffer sb =  new StringBuffer(); 
                 try { 
                        LineNumberReader reader =  new LineNumberReader( new BufferedReader( new InputStreamReader( new FileInputStream(file), charset))); 
                        String line; 
                         while ((line = reader.readLine()) !=  null) { 
                                sb.append(line).append(System.getProperty( "line.separator")); 
                        } 
                        reader.close(); 
                }  catch (UnsupportedEncodingException e) { 
                        log.error( "读取文件为一个内存字符串失败,失败原因是使用了不支持的字符编码" + charset, e); 
                }  catch (FileNotFoundException e) { 
                        log.error( "读取文件为一个内存字符串失败,失败原因所给的文件" + file +  "不存在!", e); 
                }  catch (IOException e) { 
                        log.error( "读取文件为一个内存字符串失败,失败原因是读取文件异常!", e); 
                } 
                 return sb.toString(); 
        } 

         /** 
         * 将字符串存储为一个文件,当文件不存在时候,自动创建该文件,当文件已存在时候,重写文件的内容,特定情况下,还与操作系统的权限有关。 
         * 
         * @param text         字符串 
         * @param distFile 存储的目标文件 
         * @return 当存储正确无误时返回true,否则返回false 
         */
 
         public  static  boolean string2File(String text, File distFile) { 
                 if (!distFile.getParentFile().exists()) distFile.getParentFile().mkdirs(); 
                BufferedReader br =  null
                BufferedWriter bw =  null
                 boolean flag =  true
                 try { 
                        br =  new BufferedReader( new StringReader(text)); 
                        bw =  new BufferedWriter( new FileWriter(distFile)); 
                         char buf[] =  new  char[1024 * 64];          //字符缓冲区 
                         int len; 
                         while ((len = br.read(buf)) != -1) { 
                                bw.write(buf, 0, len); 
                        } 
                        bw.flush(); 
                        br.close(); 
                        bw.close(); 
                }  catch (IOException e) { 
                        flag =  false
                        log.error( "将字符串写入文件发生异常!", e); 
                } 
                 return flag; 
        } 

         public  static  void main(String[] args) { 
                String x = file2String( new File( "C:\\a.txt"),  "GBK"); 
                System.out.println(x); 

                 boolean b = string2File(x,  new File( "C:\\b.txt")); 
                System.out.println(b); 
        } 
}
 
二、Doc文档的一些常用操作
 
构建Document文档对象,删除、添加XML元素,格式化XML。
 
package zzvcom.common; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.dom4j.*; 
import org.dom4j.io.OutputFormat; 
import org.dom4j.io.XMLWriter; 

import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.StringWriter; 
import java.util.List; 

/** 
* XML便捷工具箱 

* @author leizhimin 2009-11-11 16:26:19 
*/
 
public  class XmlToolkit { 
         private  static Log log = LogFactory.getLog(XmlToolkit. class); 


         /** 
         * 根据classpath下xml文件名创建一个XML文档对象,并制定读取字符集 
         * 
         * @param classPathFileName xml文件名称, 
         * @param charset                     xml文件字符集编码 
         * @return xml的字符串 
         */
 
         public  static Document makeDocument(String classPathFileName, String charset) { 
                Document doc =  null
                 try { 
                        InputStream in = XmlToolkit. class.getClassLoader().getResourceAsStream(classPathFileName); 
                        String xml = StringFileToolkit.stream2String(in, charset); 
                        doc = DocumentHelper.parseText(xml); 
                }  catch (Exception e) { 
                        log.error( "解析XML发生错误,请检查ClassPath下面的" + classPathFileName +  "文件是否存在,格式是否是正确!"); 
                         throw  new RuntimeException(e); 
                } 
                 return doc; 
        } 

         /** 
         * 创建一个XML文档对象 
         * 
         * @param xmlfile xml文件 
         * @param charset xml文件字符集编码 
         * @return xml的字符串 
         */
 
         public  static Document makeDocument(File xmlfile, String charset) { 
                Document doc =  null
                 try { 
                        String xml = StringFileToolkit.file2String(xmlfile, charset); 
                        doc = DocumentHelper.parseText(xml); 
                }  catch (Exception e) { 
                        log.error( "解析XML发生错误,请检查" + xmlfile.getPath() +  "文件是否存在,格式是否是正确!"); 
                         throw  new RuntimeException(e); 
                } 
                 return doc; 
        } 

         /** 
         * 删除文档doc的指定路径下的所有子节点(包含元素,属性等) 
         * 
         * @param doc     文档对象 
         * @param xpath 指定元素的路径 
         * @return 删除成功时返回true,否则false 
         */
 
         public  static  boolean deleteNodes(Document doc, String xpath) { 
                 boolean flag =  true
                 try { 
                        List<Node> nlist = doc.selectNodes(xpath); 
                         for (Node node : nlist) { 
                                node.detach(); 
                        } 
                }  catch (Exception e) { 
                        flag =  false
                } 
                 return flag; 
        } 

         /** 
         * 删除一个父元素下所有的子节点(包含元素,属性等) 
         * 
         * @param element 父元素 
         * @return 删除成功时返回true,否则false 
         */
 
         public  static  boolean deleteChildren(Element element) { 
                 boolean flag =  true
                 try { 
                        List<Node> nlist = element.elements(); 
                         for (Node node : nlist) { 
                                node.detach(); 
                        } 
                }  catch (Exception e) { 
                        flag =  false
                } 
                 return flag; 
        } 

         /** 
         * 在指定文档doc的xpath元素下面添加ename子元素,并给出子元素的text值 
         * 
         * @param doc        文档对象 
         * @param xpath    父元素的xpath 
         * @param ename    所加入子元素名称 
         * @param evalue 所加入子元素的text值 
         * @return 加入后的xml元素 
         */
 
         public  static Element addElement(Document doc, String xpath, String ename, String evalue) { 
                Element element =  null
                Node n = (Node) doc.selectSingleNode(xpath); 
                 if (n  instanceof Element) { 
                        Element e = (Element) n; 
                        element = e.addElement(ename); 
                        element.setText(evalue); 
                } 
                 return element; 
        } 

         /** 
         * 在指定文档doc的xpath元素下面添加xml文档为子元素 
         * 
         * @param doc     文档对象 
         * @param xpath 父元素的xpath 
         * @param xml     要加入的xml文档 
         * @return 所加入后的xml元素 
         */
 
         public  static Element addElementByString(Document doc, String xpath, String xml) { 
                Element subdoc =  null
                 try { 
                        subdoc = DocumentHelper.parseText(xml).getRootElement(); 
                }  catch (DocumentException e) { 
                        e.printStackTrace(); 
                } 
                Node n = (Node) doc.selectSingleNode(xpath); 
                 if (n  instanceof Element) { 
                        Element e = (Element) n; 
                        e.add(subdoc); 
                        System.out.println(subdoc.getPath()); 
                } 
                 return subdoc; 
        } 

         /** 
         * 格式化XML文档 
         * 
         * @param document xml文档 
         * @param charset    字符串的编码 
         * @return 格式化后XML字符串 
         */
 
         public  static String formatXML(Document document, String charset) { 
                OutputFormat format = OutputFormat.createPrettyPrint(); 
                format.setEncoding(charset); 
                StringWriter sw =  new StringWriter(); 
                XMLWriter xw =  new XMLWriter(sw, format); 
                 try { 
                        xw.write(document); 
                        xw.flush(); 
                        xw.close(); 
                }  catch (IOException e) { 
                        log.error( "格式化XML文档发生异常,请检查!", e); 
                } 
                 return sw.toString(); 
        } 
}
 
 
测试输出结果:
/platscheme/scheme/vcom 
<?xml version= "1.0" encoding= "GBK"?> 
<platscheme> 
        <schemeName/> 
        <schemeId/> 
        <platformname>1</platformname> 
        <platformId>1</platformId> 
        <updCapacity>1</updCapacity> 
        <onlineCapacity>1</onlineCapacity> 
        <delCapacity>1</delCapacity> 
        <scheme><movies><del><movie mpeg= "" moviename="" generid= "0" onlinedate=""/> 
                        </del></movies> 
        <vcom> 
  <ftpinfo> 
    <serverip>127.0.0.1</serverip> 
    <serverport>21</serverport> 
    <username>ftpnv2cds1</username> 
    <password>ftp</password> 
  </ftpinfo> 

  <webserviceinfo> 
    <serverip>127.0.0.1</serverip> 
    <serverport>8888</serverport> 
  </webserviceinfo> 

  <planinfo> 
    <!--璁″垝缂栧彿--> 
    <planid>filename</planid> 
    <downloadfile> 
      <!--闇�瑕佷笅杞界殑鏂囦欢淇℃伅--> 
      <plandata plandataid= "1" filepath= "/" filename= "filename"/> 
    </downloadfile> 
  </planinfo> 
</vcom></scheme> 
</platscheme> 
----------------------------- 
<?xml version= "1.0" encoding= "UTF-8"?> 

<platscheme>    
    <schemeName/>     
    <schemeId/>     
    <platformname>1</platformname>     
    <platformId>1</platformId>     
    <updCapacity>1</updCapacity>     
    <onlineCapacity>1</onlineCapacity>     
    <delCapacity>1</delCapacity>     
    <scheme> 
        <movies> 
            <del> 
                <movie mpeg= "" moviename="" generid= "0" onlinedate=""/>    
            </del> 
        </movies>     
        <vcom>    
            <ftpinfo>    
                <serverip>127.0.0.1</serverip>     
                <serverport>21</serverport>     
                <username>ftpnv2cds1</username>     
                <password>ftp</password>    
            </ftpinfo>     
            <webserviceinfo>    
                <serverip>127.0.0.1</serverip>     
                <serverport>8888</serverport>    
            </webserviceinfo>     
            <planinfo>    
                <!--璁″垝缂栧彿-->     
                <planid>filename</planid>     
                <downloadfile>    
                    <!--闇�瑕佷笅杞界殑鏂囦欢淇℃伅-->     
                    <plandata plandataid= "1" filepath= "/" filename= "filename"/>    
                </downloadfile>    
            </planinfo>    
        </vcom> 
    </scheme>    
</platscheme> 


Process finished with exit code 0
 
有了以上的扩展,结合Dom4j,处理XML的工作会变得相当轻松容易。


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/225311,如需转载请自行联系原作者
相关文章
|
6月前
|
安全 Java
J2EE&XML解析&dom4j的使用
J2EE&XML解析&dom4j的使用
|
7月前
|
XML 存储 JavaScript
Dom4j框架解析XML
Dom4j框架解析XML
66 0
|
4月前
|
XML 数据格式
dom4j解析xml实战
dom4j解析xml实战
|
4月前
|
XML JavaScript API
框架选修课之dom4j解析xml字符串实例
框架选修课之dom4j解析xml字符串实例
50 1
|
9月前
|
XML SQL Java
【Java】Java核心 77:Dom4j 解析 XML综合案例
1、需求 需求:自定义dao层jdbc框架 为了方便程序员操作数据库,让程序员更关注于sql代码层面和业务层面
【Java】Java核心 77:Dom4j 解析 XML综合案例
|
6月前
|
XML JavaScript 数据格式
使用Dom4J解析XML文档
XML解析的方式 XML常见的两种解析方式: DOM: 要求解析器将整个XML文件全部加载到内存中,生成一个Document对象 优点:元素和元素之间保留结构、关系,可以针对元素进行增删查改操作 缺点:如果XML文件过大,可能会导致内存溢出 SAX:是一种速度更快,更加高效的解析方式。它是逐行扫描,边扫描边解析,并且以事件驱动的方式来进行具体的解析,每解析一行都会触发一个事件 优点: 不会出现内存溢出的问题,可以处理大文件 缺点:只能读,不能写 概念辨析: 解析器就是根据不同的解析方式提供具体的实现。 为了方便开发人员来解析XML,有一些方便操作的类库。例如Dom4j其中就包含了很多解
59 0
|
8月前
|
XML 存储 JavaScript
DOM、JDOM、DOM4J解析XML
DOM、JDOM、DOM4J解析XML
72 0
|
9月前
|
XML JavaScript Java
【Java】Java核心 76:XML解析 Dom4j (下)
3 使用xpath技术结合DOM4J技术读取xml文件(了解) 1.概念介绍 问题:通过上面的案例我们发现有个小问题.就是获取标签的过程太过繁琐。我们需要一层一层的去获取。假设xml嵌套了50层的话,对于我们开发者来说是非常繁琐的。所以我们希望应该有这样的技术,一下子直接就能获取我们所需要的标签对象。这就是我们接下来需要学习的xpath技术。
|
9月前
|
XML 存储 JavaScript
【Java】Java核心 75:XML解析 Dom4j (上)
1 XML解析 1.1 解析概述 当将数据存储在XML后,我们就希望通过程序获取XML的内容。我们使用Java基础所学的IO知识是可以完成的,不过需要非常繁琐的操作才可以完成,且开发中会遇到不同问题(只读、读写)。 人们为不同问题提供不同的解析方式,使用不同的解析器进行解析,方便开发人员操作XML。
|
XML JavaScript Java
jar包神作之 dom4j (让xml解析变得如此简单)
xml的增删改查(dom4j.jar) 应该不用多久就可以使用通过jdk自带的jar包实现解析,–》dom解析,现在基础比较薄弱
359 0