博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
增强Dom4j--让XML处理更容易
阅读量:6078 次
发布时间:2019-06-20

本文共 8113 字,大约阅读时间需要 27 分钟。

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,如需转载请自行联系原作者
你可能感兴趣的文章
cad图纸转换完成的pdf格式模糊应该如何操作?
查看>>
Struts2与Struts1区别
查看>>
网站内容禁止复制解决办法
查看>>
Qt多线程
查看>>
我的友情链接
查看>>
想说一点东西。。。。
查看>>
css知多少(8)——float上篇
查看>>
NLB网路负载均衡管理器详解
查看>>
水平添加滚动条
查看>>
PHP中”单例模式“实例讲解
查看>>
VS2008查看dll导出函数
查看>>
VM EBS R12迁移,启动APTier . AutoConfig错误
查看>>
atitit.细节决定成败的适合情形与缺点
查看>>
iOS - Library 库
查看>>
MATLAB 读取DICOM格式文件
查看>>
spring事务管理(Transaction)
查看>>
django.contrib.auth登陆注销学习
查看>>
js执行本地exe文件的3种方法
查看>>
理解B树索引
查看>>
vi编辑器的命令集合
查看>>