DOM4J操作XML(包括封装和解析)

先来看看dom4j中相应XML的DOM树建立的继承关系

针对于XML标准定义。相应于图2-1列出的内容,dom4j提供了下面实现:

以下给出一个详细事例:

package com.iboxpay.settlement.gateway.common.util;



import java.io.IOException;

import java.io.StringReader;

import java.io.StringWriter;



import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.DocumentHelper;

import org.dom4j.Element;

import org.dom4j.io.OutputFormat;

import org.dom4j.io.SAXReader;

import org.dom4j.io.XMLWriter;



import com.iboxpay.settlement.gateway.ccb.Constant;

import com.iboxpay.settlement.gateway.common.exception.PackMessageException;

import com.iboxpay.settlement.gateway.common.exception.ParseMessageException;



/**

 * DOM4j工具类

 * @author caolipeng

 */

public class DomUtil {

    /**

     * 加入孩子节点元素

     * @param parent 父节点

     * @param childName 孩子节点名称

     * @param childValue 孩子节点值

     * @return 新增节点

     */

    public static Element addChild(Element parent, String childName,

            String childValue) {

        Element child = parent.addElement(childName);//加入节点元素

        child.setText(childValue == null ?

"" : childValue); //为元素设值

        return child;

    }

    /**

     * DOM4j的Document对象转为XML报文串

     * @param document

     * @param charset

     * @return 经过解析后的xml字符串

     */

    public static String documentToString(Document document,String charset) {

        StringWriter stringWriter = new StringWriter();

        OutputFormat format = OutputFormat.createPrettyPrint();//获得格式化输出流  

        format.setEncoding(charset);//设置字符集,默觉得UTF-8

        XMLWriter xmlWriter = new XMLWriter(stringWriter, format);//写文件流

        try {

            xmlWriter.write(document);

            xmlWriter.flush();

            xmlWriter.close();

        } catch (IOException e) {

            throw new RuntimeException(e);

        }

        return stringWriter.toString();

    }

    /**

     * 去掉声明头的(即<?xml...?>去掉)

     * @param document

     * @param charset

     * @return

     */

    public static String documentToStringNoDeclaredHeader(Document document,String charset) {

        String xml = documentToString(document, charset);

        return xml.replaceFirst("\\s*<[^<>]+>\\s*", "");

    }

    /**

     * 解析XML为Document对象

     * @param xml 被解析的XMl

     * @return Document

     * @throws ParseMessageException

     */

    public final static Element parseXml(String xml)throws ParseMessageException{

        StringReader sr = new StringReader(xml);

        SAXReader saxReader = new SAXReader();  

        Document document;

        try {

            document = saxReader.read(sr);

        } catch (DocumentException e) {

            throw new ParseMessageException(e);

        }

        Element rootElement = document.getRootElement();    

        return rootElement;

    }

    

    public final static String getText(Element e, String tag){

        Element _e = e.element(tag);

        if(_e != null)

            return _e.getText();

        else

            return null;

    }

    public final static String getTextTrim(Element e, String tag){

        Element _e = e.element(tag);

        if(_e != null)

            return _e.getTextTrim();

        else

            return null;

    }

    /**

     * 获取节点值.节点必须不能为空,否则抛错

     * @param parent

     * @param tag

     * @return

     * @throws ParseMessageException

     */

    public final static String getTextTrimNotNull(Element parent, String tag) throws ParseMessageException{

        Element e = parent.element(tag);

        if(e == null)

            throw new ParseMessageException(parent.getName() + " -> " + tag + " 节点为空.");


        else

            return e.getTextTrim();

    }

    /**

     * 节点必须不能为空,否则抛错

     * @param parent

     * @param tag

     * @return

     * @throws ParseMessageException

     */

    public final static Element elementNotNull(Element parent, String tag) throws ParseMessageException{

        Element e = parent.element(tag);

        if(e == null)

            throw new ParseMessageException(parent.getName() + " -> " + tag + " 节点为空.");


        else

            return e;

    }

    public static void main(String[] args) throws PackMessageException, ParseMessageException {

        Document document = DocumentHelper.createDocument();  

        document.setXMLEncoding("GB2312");

        Element root = document.addElement("TX");

        DomUtil.addChild(root, "REQUEST_SN", "bankBatchSeqId");

        DomUtil.addChild(root, "CUST_ID", "cust_id");

        DomUtil.addChild(root, "USER_ID", "user_id");

        DomUtil.addChild(root, "PASSWORD", "password");

        DomUtil.addChild(root, "TX_CODE", "txCode");

        DomUtil.addChild(root, "LANGUAGE", "CN");

        Element tx_info = root.addElement(Constant.TX_INFO);

        DomUtil.addChild(tx_info, Constant.REQUEST_SN1, "request_sn1");

        String xml = DomUtil.documentToStringNoDeclaredHeader(root.getDocument(), "GBK");

        System.out.println(xml);

        root = parseXml(xml);

        System.out.println(root.element("TX_INFO").elementText("REQUEST_SN1"));

    }

}

主函数測试结果为:

<TX>

  <REQUEST_SN>bankBatchSeqId</REQUEST_SN>

  <CUST_ID>cust_id</CUST_ID>

  <USER_ID>user_id</USER_ID>

  <PASSWORD>password</PASSWORD>

  <TX_CODE>txCode</TX_CODE>

  <LANGUAGE>CN</LANGUAGE>

  <TX_INFO>

    <REQUEST_SN1>request_sn1</REQUEST_SN1>

  </TX_INFO>

</TX>



request_sn1




博客參考文献:http://www.cnblogs.com/macula/archive/2011/07/27/2118003.html


DOM4J操作XML(包括封装和解析)的更多相关文章

  1. xml解析 使用dom4j操作xml

     使用dom4j操作xml 1 导入 dom4j,的jar包   2 指定要解析的XML文件 SAXReader sr=new SAXReader(); Document document= sr.r ...

  2. 2.3 使用 dom4j 对 xml文件进行 dom 解析

    // 使用dom4j对XML文档进行解析 CRUD public class Demo1 { //读取XML文档中第二本书的书名 <书名>javaWEB</书名> @Test ...

  3. Java xml 操作(Dom4J修改xml   + xPath技术  + SAX解析 + XML约束)

    1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大 ...

  4. XML学习笔记(2)--dom4j操作XML

    1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...

  5. 使用dom4j操作XML

    DOM4J介绍 DOM4J是使用Java语言编写的,用于读写及操作XML的一套组件,DOM4J同时具有DOM修改文件的优点和SAX读取快速的优点. DOM4J的使用 首先下载dom4j的JAR包,我用 ...

  6. dom4j操作xml文档

    java Dom4j解析XML文件 标签(空格分隔):java进阶 xml文档: <?xml version="1.0" encoding="UTF-8" ...

  7. Strus2第一次课:dom4j操作xml

    先从底层的xml操作技术记录: 当我们新建一个项目,什么架包都没加入的时候,java提供了 org.w3c.dom给我们操作xml里面的元素 import org.w3c.dom.Document; ...

  8. dom4j操作xml对象

         // 获取Documen对象      public static Document getDocument(String path) throws Exception{           ...

  9. 使用Dom4j操作XML数据

    --------------siwuxie095                             dom4j 是一个非常优秀的 Java XML 的 API, 用来读写 XML 文件 和操作 ...

随机推荐

  1. JVM Object Query Language (OQL) 查询语言

    Object Query Language (OQL) OQL is SQL-like query language to query Java heap. OQL allows to filter/ ...

  2. virtualbox虚拟机ubuntu操作系统,设置网络互通、访问,能访问虚拟机swoole的http服务

    网络互通 1.设置virtualbox网络连接模式为桥接网卡模式 2.重启虚拟机查看虚拟机IP ifconfig 3.开启window的telnet程序 控制面板->程序->启用或关闭wi ...

  3. [Angular] Angular Attribute Decorator - When to use it?

    When we pass value to a component, normally we use @Input. <my-comp [courses]="(courses$ | a ...

  4. jquery 中attr和prop的区别

    在jQuery API中也有专门解释: Attributes VS. Properties 在一些特殊的情况下,attributes和properties的区别非常大.在jQuery1.6之前,.at ...

  5. HTML5游戏探讨,怎样让微信游戏仅仅能执行在微信中

    大致文件布局例如以下.一个html文件.一个loading.js,在loading.js中载入其它须要的js和css. 至于详细的速度的话.建议cdn或者一个域中最多载入6个js文件.在loading ...

  6. 怎样优化cocos2d/x程序的内存使用和程序大小

    再次感谢原创者:Steffen Itterheim.原创博客原文地址: http://www.learn-cocos2d.com/2012/11/optimize-memory-usage-bundl ...

  7. Django—— 缓存框架

    译者注:1.无用的,吹嘘的说辞不翻译:2.意译,很多地方不准确. 动态网站最为重要的一点就是好,网页是动态的.每一次用户请求页面,网站就要进行各种计算——从数据库查询,到render模板,到各种逻辑运 ...

  8. Oracle 数字操作。数字函数。mod(),trunc(),round(),ceil(),floor的使用

    1,取整函数(ceil 向上取整,floor 向下取整) 第一种方式: ) from dual -- 取整 trunc (1.9) = 1 第二种方式 select ceil(66.6) N1,flo ...

  9. centos7 安装及破解 jira 7.3.3

    JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域. 同样jira 的运行依赖java环境,上一节已经 ...

  10. 《windows核心编程》 17章 内存映射文件

    内存映射文件主要用于以下三种情况: 系统使用内存映射文件载入并运行exe和dll,这大量节省了页交换文件的空间以及应用程序的启动时间 开发人员可以使用内存映射文件来访问磁盘上的数据文件.这使得我们可以 ...