`
tianjun309
  • 浏览: 368224 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

XML转化为VO类的通用方法(综合dom4j和xStream)

XML 
阅读更多
package com.test

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.QName;
import org.dom4j.tree.DefaultElement;

import com.test.common.exception.UspMonitorException;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

/**
 * xml解析为VO工具类
 *
 * @author tianjun tkf36897
 * @version 1.0 Dec 13, 2010
 * 
 * 针对预研出的xml进行xmlutil类的更新:
 * (1)直接调用 XmlUtil.fromXML 拿到对应的EC2/S3 VO类
 * (2)xml节点为空值,对应VO值为空字符串
 * (3)xml节点不存在,对应VO值为null
 * (4)在deleteExcess方法中去掉预研给出多余的region节点
 * (5)下面main方法里面有实际调用例子
 * (6)如果是其他项目需求,请针对细节修改即可
 */
public class XmlUtil
{
    /**
     * item节点的统计
     */
    private static Set<String> indexList;

    /**
     * 初始化
     * 
     * @author tianjun tkf36897
     * @version 1.0 Dec 13, 2010
     */
    private static void init()
    {
        indexList = new HashSet<String>(0);
    }

    /**
     * (***)将xml转化为VO操作
     * 
     * 具体调用例子看下面main方法
     * 
     * @author tianjun tkf36897
     * @param xml 传入的xml
     * @param objClass 需要转换的类Class实例
     * @param itemClass 其中item的类Class实例,请按照顺序传入
     * @return 转换后的VO类
     * @throws UspMonitorException UspMonitorException
     * @version 1.0 Dec 13, 2010
     */
    @SuppressWarnings("unchecked")
    public static Object fromXML(String xml, Class objClass, Class... itemClass) throws UspMonitorException
    {
        init();
        XStream stream = new XStream(new DomDriver());
        if(itemClass != null && itemClass.length != 0)
        {
            for (int i = 0; i < itemClass.length; i++)
            {
                stream.alias("item" + i, itemClass[i]);
            }
        }

        String resultXml = null;
        try
        {
            Document document = DocumentHelper.parseText(deleteExcess(xml));
            Element root = document.getRootElement();
            root.setQName(new QName(objClass.getName()));
            changeTime(root.elements());
            changeItem(root.elements());
            resultXml = root.asXML();
        } catch (DocumentException e)
        {
//            UspLog.error("XmlUtil.fromXML():" + e.getMessage(), e);
            throw new UspMonitorException(
                    "XmlUtil.fromXML():DocumentException " + e.getMessage(), e);
        }

        return stream.fromXML(resultXml);
    }

    /**
     * 将item节点进行改名操作
     * 
     * 便于后面进行一对一的解析
     * @author tianjun tkf36897
     * @param elementList
     * @version 1.0 Dec 13, 2010
     */
    @SuppressWarnings("unchecked")
    private static void changeItem(List<Element> elementList)
    {
        Element tempElement;

        for (int i = 0; i < elementList.size(); i++)
        {
            tempElement = elementList.get(i);
            if (tempElement.getQName().getName().toLowerCase().equals("item"))
            {
                indexList.add(tempElement.getParent().getQName().getName());
                tempElement
                        .setQName(new QName("item" + (indexList.size() - 1)));
            }
        }

        for (int i = 0; i < elementList.size(); i++)
        {
            changeItem(elementList.get(i).elements());
        }
    }

    /**
     * 去除多余的节点
     * 
     * @author tianjun tkf36897
     * @param xmlString
     * @return
     * @version 1.0 Dec 13, 2010
     */
    private static String deleteExcess(String xmlString)
    {
        return xmlString.replaceAll("(<region>).*(</region>)", "");
    }

    /**
     * 进行time节点的对应修改
     * 
     * @author tianjun tkf36897
     * @param elementList
     * @version 1.0 Dec 13, 2010
     */
    @SuppressWarnings("unchecked")
    private static void changeTime(List<Element> elementList)
    {
        Date time = null;
        Calendar calendar;
        String tempTime = null;
        Element tempElement;
        Element timeElement;
        Element tempParentElement = null;

        for (int i = 0; i < elementList.size(); i++)
        {
            tempElement = elementList.get(i);
            if (tempElement.getQName().getName().toLowerCase().contains("time"))
            {
                // 下面的time换成我之前写的switchTime
                time = new Date();
                calendar = new GregorianCalendar();
                calendar.setTime(time);
                tempTime = calendar.toString().split("\\[")[1].split(",")[0]
                        .split("=")[1];
                tempParentElement = tempElement.getParent();
                tempParentElement.remove(tempElement);
                tempElement = new DefaultElement(tempElement.getQName()
                        .getName());
                timeElement = new DefaultElement("time");
                timeElement.setText(tempTime);
                tempElement.add(timeElement);
                tempParentElement.add(tempElement);
            }
        }

        if (time == null)
        {
            for (int i = 0; i < elementList.size(); i++)
            {
                changeTime(elementList.get(i).elements());
            }
        }
    }
    
    
    
//    /**
//     * 
//     * 
//     * @author tianjun tkf36897
//     * @param args
//     * @version 1.0 Dec 13, 2010
//     * @throws UspMonitorException 
//     */
//    public static void main(String[] args) throws UspMonitorException
//    {
//        String temp2 = "<DescribeSnapshotsResponse xmlns=\"http://ec2.amazonaws.com/doc/2010-08-31/\">"
//            + "<requestId>tianjun_requestId</requestId>"
//            + "<region>tianjun_requestId</region>"
//            + "<snapshotSet>"
//            + "<item>"
//            + "<snapshotId>110110snapId</snapshotId>"
//            + "<volumeId>33434volumeId</volumeId>"
//            + "<status>started</status>"
//            + "<startTime>2010-07-29T04:12:01.000Z</startTime>"
//            + "<progress>10%</progress>"
//            + "<ownerId>tianjun</ownerId>"
//            + "<volumeSize>33</volumeSize>"
//            + "<description>setDescription</description>"
//            + "<ownerAlias>setOwnerAlias</ownerAlias>"
//            + "<tagSet>"
//            + "  <item>"
//            + "    <key>setkey</key>"
//            + "    <value>setValue</value>"
//            + "  </item>"
//            + "  <item>"
//            + "    <key>tep2</key>"
//            + "    <value>dddValue</value>"
//            + "  </item>"
//            + "  <item>"
//            + "    <key>tep2</key>"
//            + "    <value>dddValue</value>"
//            + "  </item>"
//            + "</tagSet>"
//            + "</item>"
//            + "<item>"
//            + "<snapshotId>110110snapId</snapshotId>"
//            + "<volumeId>33434volumeId</volumeId>"
//            + "<status>started</status>"
//            + "<startTime>2010-07-29T04:12:01.000Z</startTime>"
//            + "<progress>10%</progress>"
//            + "<ownerId>tianjun</ownerId>"
//            + "<volumeSize>33</volumeSize>"
//            + "<description></description>"
//            + "<ownerAlias>setOwnerAlias</ownerAlias>"
//            + "<tagSet>"
//            + "  <item>"
//            + "    <key>setkey</key>"
//            + "    <value>setValue</value>"
//            + "  </item>"
//            + "  <item>"
//            + "    <key>tep2</key>"
//            + "    <value>dddValue</value>"
//            + "  </item>"
//            + "  <item>"
//            + "    <key>tep2</key>"
//            + "    <value>dddValue</value>"
//            + "  </item>"
//            + "</tagSet>"
//            + "</item>" + "</snapshotSet>" + "</DescribeSnapshotsResponse>";
//        
//        DescribeSnapshotsResponseType temp33 = (DescribeSnapshotsResponseType) fromXML(
//                temp2, DescribeSnapshotsResponseType.class,DescribeSnapshotsSetItemResponseType.class,ResourceTagSetItemType.class);
//        System.out.println(temp33.getSnapshotSet()[1].getDescription());
//    }
}
 
分享到:
评论

相关推荐

    dom4j、XStream的jar包

    DOM4J和XStream是Java开发中处理XML数据的两个重要工具,它们分别在XML文档解析和Java对象到XML的转换方面提供了强大的功能。 DOM4J是一个非常灵活且功能丰富的XML处理库,它提供了多种方式来操作XML文档,包括读取...

    dom4j和XStream的最新版jar包以及简单示例demo(xml解析)

    解压后有一个文件夹(包含了dom4j和XStream的简单示例),一个dom4j.jar(用dom4j只需要把这个添加到项目里面),一个xstream-1.4.8的jar包、源码、说明文档.zip(用xstream就解压这个包然后放到项目里面)

    基于XStream,DOM4J实现xml工具类可直接运行

    在提供的压缩包“xmlPro”中,可能包含了一系列示例代码或工具类,展示了如何集成XStream和DOM4J,以便在实际项目中高效地处理XML数据。 总的来说,理解和熟练掌握XStream和DOM4J对于Java开发人员来说非常重要,...

    使用dom4j高效率xml解析,内涵demo程序,idea导入即可运行,适用于各种复杂xml的解析,给自己留作备份,有需要可下载。

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于配置文件、数据交换、文档存储等...在实际开发中,根据具体场景选择合适的方法,结合DOM4J提供的工具类,可以大大提高XML处理的效率和便捷性。

    dom+xstream

    在提供的"dom+xstream"压缩包中,可能包含了这两个库的jar文件,以及示例代码或者测试用例,用于演示如何将DOM4J解析的XML数据通过XStream进行序列化和反序列化。用户解压后可以直接引入到自己的项目中,无需额外...

    xstream_dom4j_jdom_groovy解析xml

    本主题聚焦于四种不同的Java库——XStream、Dom4j、Groovy以及JDOM,它们都是用来解析和操作XML文档的工具。 1. **XStream**: XStream是一个Java库,它提供了将Java对象序列化为XML,以及从XML反序列化回Java对象...

    dmo4j和xstream

    在IT领域,XML...在处理XML的项目中,dom4j和XStream是强大的工具,可以大大提高开发效率。在给定的文件列表中,`dom4j-1.6.1.jar`和`xstream.jar`分别是这两个库的可执行文件,可以直接引入到Java项目中使用。

    微信公众号使用到的dom4j和xstream的jar

    由于先前有已经有上传过dom4j和xtream的两个jar包了,但最近看到之前那个下载积分变成27了,这可能是csdn的bug,我原先都是定义1个积分,因为csdn现在没有0积分了,最低就是1积分!

    微信开发用到的jar包:json 解析,dom4j-1.6.1.jar,xstream-1.3.1.jar

    `dom4j-1.6.1.jar`是DOM4J的一个版本,包含所有必要的类和方法来处理XML任务。 3. XStream: XStream是另一个强大的Java库,用于XML序列化和反序列化。它可以将Java对象直接转换为XML,反之亦然。这在需要将Java...

    Dom4j封装和解析

    使用Dom4j解析XML文档主要有两种方式:SAX和DOM。这里我们主要介绍DOM方式,因为它是最直观的。 - **创建Document对象** ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; Document document...

    dom4j解析XML的两个JAR包

    - DOM4J通过提供丰富的接口和类,使得开发者可以轻松地处理XML文档的各种操作,如添加、删除或修改元素和属性,以及读取XML数据。 - 版本1.6.1是DOM4J的一个稳定版本,包含了对XML Schema的支持,以及对Java 5特性...

    java解析XML所需要的完整包(包括XStream.jar,dom4j.jar和xpull/xpp.jar)

    例如,你可以直接使用`XStream.fromXML(String xml)`方法将XML字符串转化为Java对象,反之亦然。 2. **dom4j.jar**: DOM4J是一个非常灵活的用于处理XML的Java库,它是基于DOM(Document Object Model)模型的,但...

    java 解析xml所需要的dom4j包

    描述中提到的"java xml解析所需要的包",通常包括了DOM4J库和其他辅助库,如XStream。XStream是一个用于Java的XML序列化库,能够将Java对象直接转换为XML,反之亦然。这在需要将数据持久化到XML或者从XML中恢复数据...

    dom4j2

    4. **文档构建和修改**:DOM4J提供了方便的方法来构建XML文档,如添加、删除、替换或更新元素、属性等。 5. **Namespace支持**:DOM4J2可以处理XML命名空间,这对于处理符合XML规范的文档至关重要。 6. **扩展性**...

    Dom4j+Dom的jar包

    在添加依赖后,你就可以直接在代码中使用它们提供的类和方法进行XML处理。例如,使用DOM4J解析XML文件: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; // ...

    DOM4J很全的学习资料知识点讲解加上例子

    - 转换XML到Java对象:DOM4J可以结合JAXB或XStream进行对象-XML的转换。 8. **最佳实践**: - 使用DOM4J的迭代器遍历XML,以降低内存消耗。 - 对于大型XML,优先考虑SAX或StAX解析。 - 注意异常处理,确保程序...

    dom4j-1.6.1.jar下载

    **DOM4J-1.6.1.jar** 是一个Java库,主要用于XML文档的处理,解析和操作。这个版本的DOM4J是一个流行的开源项目,它提供了强大的API,使得开发者可以更加灵活、高效地处理XML数据。在Java开发中,DOM4J常被用于构建...

    DOM4J,Jaxen,XStream,FastJson,Gson

    本讲将探讨五个关键的库:DOM4J、Jaxen、XStream、FastJson和Gson,它们分别在XML解析和JSON操作中扮演着重要角色。 1. DOM4J:DOM4J是一个非常灵活的用于处理XML的Java库,它提供了全面的DOM、SAX和JDOM支持。DOM4...

    dom4j api和jar包

    此外,DOM4J还能与JAXB和XStream等序列化库配合,将Java对象转换为XML或反之,这对于数据交换和持久化非常有用。 总的来说,DOM4J是一个功能丰富的XML处理工具,无论你是新手还是经验丰富的开发者,都可以通过其...

    dom4j-1.6.1.jar和jaxen-1.1-beta-7.jar

    dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML...

Global site tag (gtag.js) - Google Analytics