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是Java开发中处理XML数据的两个重要工具,它们分别在XML文档解析和Java对象到XML的转换方面提供了强大的功能。 DOM4J是一个非常灵活且功能丰富的XML处理库,它提供了多种方式来操作XML文档,包括读取...
解压后有一个文件夹(包含了dom4j和XStream的简单示例),一个dom4j.jar(用dom4j只需要把这个添加到项目里面),一个xstream-1.4.8的jar包、源码、说明文档.zip(用xstream就解压这个包然后放到项目里面)
在提供的压缩包“xmlPro”中,可能包含了一系列示例代码或工具类,展示了如何集成XStream和DOM4J,以便在实际项目中高效地处理XML数据。 总的来说,理解和熟练掌握XStream和DOM4J对于Java开发人员来说非常重要,...
XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于配置文件、数据交换、文档存储等...在实际开发中,根据具体场景选择合适的方法,结合DOM4J提供的工具类,可以大大提高XML处理的效率和便捷性。
在提供的"dom+xstream"压缩包中,可能包含了这两个库的jar文件,以及示例代码或者测试用例,用于演示如何将DOM4J解析的XML数据通过XStream进行序列化和反序列化。用户解压后可以直接引入到自己的项目中,无需额外...
本主题聚焦于四种不同的Java库——XStream、Dom4j、Groovy以及JDOM,它们都是用来解析和操作XML文档的工具。 1. **XStream**: XStream是一个Java库,它提供了将Java对象序列化为XML,以及从XML反序列化回Java对象...
在IT领域,XML...在处理XML的项目中,dom4j和XStream是强大的工具,可以大大提高开发效率。在给定的文件列表中,`dom4j-1.6.1.jar`和`xstream.jar`分别是这两个库的可执行文件,可以直接引入到Java项目中使用。
由于先前有已经有上传过dom4j和xtream的两个jar包了,但最近看到之前那个下载积分变成27了,这可能是csdn的bug,我原先都是定义1个积分,因为csdn现在没有0积分了,最低就是1积分!
`dom4j-1.6.1.jar`是DOM4J的一个版本,包含所有必要的类和方法来处理XML任务。 3. XStream: XStream是另一个强大的Java库,用于XML序列化和反序列化。它可以将Java对象直接转换为XML,反之亦然。这在需要将Java...
使用Dom4j解析XML文档主要有两种方式:SAX和DOM。这里我们主要介绍DOM方式,因为它是最直观的。 - **创建Document对象** ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; Document document...
- DOM4J通过提供丰富的接口和类,使得开发者可以轻松地处理XML文档的各种操作,如添加、删除或修改元素和属性,以及读取XML数据。 - 版本1.6.1是DOM4J的一个稳定版本,包含了对XML Schema的支持,以及对Java 5特性...
例如,你可以直接使用`XStream.fromXML(String xml)`方法将XML字符串转化为Java对象,反之亦然。 2. **dom4j.jar**: DOM4J是一个非常灵活的用于处理XML的Java库,它是基于DOM(Document Object Model)模型的,但...
描述中提到的"java xml解析所需要的包",通常包括了DOM4J库和其他辅助库,如XStream。XStream是一个用于Java的XML序列化库,能够将Java对象直接转换为XML,反之亦然。这在需要将数据持久化到XML或者从XML中恢复数据...
4. **文档构建和修改**:DOM4J提供了方便的方法来构建XML文档,如添加、删除、替换或更新元素、属性等。 5. **Namespace支持**:DOM4J2可以处理XML命名空间,这对于处理符合XML规范的文档至关重要。 6. **扩展性**...
在添加依赖后,你就可以直接在代码中使用它们提供的类和方法进行XML处理。例如,使用DOM4J解析XML文件: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; // ...
- 转换XML到Java对象:DOM4J可以结合JAXB或XStream进行对象-XML的转换。 8. **最佳实践**: - 使用DOM4J的迭代器遍历XML,以降低内存消耗。 - 对于大型XML,优先考虑SAX或StAX解析。 - 注意异常处理,确保程序...
**DOM4J-1.6.1.jar** 是一个Java库,主要用于XML文档的处理,解析和操作。这个版本的DOM4J是一个流行的开源项目,它提供了强大的API,使得开发者可以更加灵活、高效地处理XML数据。在Java开发中,DOM4J常被用于构建...
本讲将探讨五个关键的库:DOM4J、Jaxen、XStream、FastJson和Gson,它们分别在XML解析和JSON操作中扮演着重要角色。 1. DOM4J:DOM4J是一个非常灵活的用于处理XML的Java库,它提供了全面的DOM、SAX和JDOM支持。DOM4...
此外,DOM4J还能与JAXB和XStream等序列化库配合,将Java对象转换为XML或反之,这对于数据交换和持久化非常有用。 总的来说,DOM4J是一个功能丰富的XML处理工具,无论你是新手还是经验丰富的开发者,都可以通过其...
dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML...