上一篇谈到,如何将遍历bean生成xml参数,这一篇,聊一下如何将支付平台返回的xml解析,以bean的形式返回来。
关于xml解析的文章那是相当地多啦,为了能让大家有一个大概的了解,本人不才先简单的介绍几种:
1.DOM(JAXP Crimson 解析器)
DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而 DOM 被认为是基于树或基于对象的。DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单得多。
上面是我引用别人的,简单地说,DOM解析是先把xml文件放在内存,一顿解析,把各种关系都确定好,好处就是,自由,方便的选择你想要的节点,SAX 这种扩展能力得到了更好的体现。缺点也是明显地,就是慢,因为它耗资源啊。。。
2.SAX (http://sourceforge.net/projects/sax/)
这种处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。
上面也是引用的,个人理解为:SAX只是处理指定的部分,其它的不与理会,这样好处是快,缺点就是处理不是太灵活,很难同时访问同一个文档中的多处不同数据,需要自己写更多的代码,
3.JDOM (http://www.jdom.org/)
JDOM 与 DOM 主要有两方面不同。首先,JDOM 仅使用具体类而不使用接口。这在某些方面简化了 API,但是也限制了灵活性。第二,API 大量使用了 Collections 类,简化了那些已经熟悉这些类的 Java 开发者的使用。
JDOM 自身不包含解析器。它通常使用 SAX2 解析器来解析和验证输入 XML 文档(尽管它还可以将以前构造的 DOM 表示作为输入)。它包含一些转换器以将 JDOM 表示输出成 SAX2 事件流、DOM 模型或 XML 文本文档。JDOM 是在 Apache 许可证变体下发布的开放源码。
DOM的升级版,优点是比DOM快,缺点是不如DOM灵活。速度肯定没有SAX快。这是必须的。
4.DOM4J (http://dom4j.sourceforge.net/)
虽然 DOM4J 代表了完全独立的开发结果,但最初,它是 JDOM 的一种智能分支。它合并了许多超出基本 XML 文档表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过 DOM4J API 和标准 DOM 接口具有并行访问功能。从 2000 下半年开始,它就一直处于开发之中。
为支持所有这些功能,DOM4J 使用接口和抽象基本类方法。DOM4J 大量使用了 API 中的 Collections 类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然 DOM4J 付出了更复杂的 API 的代价,但是它提供了比 JDOM 大得多的灵活性。
在添加灵活性、XPath 集成和对大文档处理的目标时,DOM4J 的目标与 JDOM 是一样的:针对 Java 开发者的易用性和直观操作。它还致力于成为比 JDOM 更完整的解决方案,实现在本质上处理所有 Java/XML 问题的目标。在完成该目标时,它比 JDOM 更少强调防止不正确的应用程序行为。
DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。
个人理解它是和DOM、JDOM一个系统的,都是树形方式读取,只不过,他是介绍于DOM和JDOM之间的一个东西,它比DOM快,比JDOM灵活,但没有DOM灵活,没有JDOM快。
结论:
JDOM 和 DOM 在测试 10M 文档时内存溢出。在小文档情况下还值得考虑使用 DOM 和 JDOM。虽然 JDOM 的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM 仍是一个非常好的选择。DOM 实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础,因为它正式获得 W3C 推荐(与基于非标准的 Java 模型相对),所以在某些类型的项目中可能也需要它(如在 JavaScript 中使用 DOM)。
SAX表现较好,这要依赖于它特定的解析方式。一个 SAX 检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)
DOM4J则是相对折衷的,目前许多开源项目中大量采用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 来读取 XML 配置文件。
考虑到移植的问题,我用了SAX,具体代码如下:
import java.io.StringReader;
import java.lang.reflect.InvocationTargetException;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
public class ParsePayXML extends DefaultHandler {
private Object retBean = null;
private String parseElemetName = "";
private String elementValue = "";
private boolean isParseElement = false;
//Handler容器
public ParsePayXML(String xmlContents, Object retBean, String parseElemetName) {
this.retBean = retBean;
this.parseElemetName = parseElemetName;
try {
XMLReader xmlReader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
xmlReader.setContentHandler(this);
StringReader reader = new StringReader(xmlContents);
InputSource input = new InputSource(reader);
xmlReader.parse(input);
} catch (Exception ex) {
}
}
//选择开始的节点
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
if (parseElemetName.equals(name)) {
isParseElement = true;
}
elementValue = "";
}
//节点结束时,将值赋给Bean
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
if (parseElemetName.equals(name)) {
isParseElement = false;
}
if (isParseElement) {
String fieldName = name;
//System.out.println("fieldName : " + fieldName);
try {
setClassField(retBean, fieldName, elementValue);
} catch(Exception ex) {
System.out.println("解析XML文件出错!!!");
}
}
}
//取节点值
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (isParseElement ){
elementValue = new String(ch, start, length);
}
}
//调用Bean的set方法。
private static void setClassField(Object beanClass, String fieldName, String fieldValue) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
String setMethodName="set"+ fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Class[] methodParam = {String.class};
Object[] params = {fieldValue};
beanClass.getClass().getDeclaredMethod(setMethodName, methodParam).invoke(beanClass, params);
}
}
分享到:
相关推荐
Java作为一种广泛使用的后端编程语言,提供了多种方式来解析XML文档,使得处理多级嵌套的数据变得可能。本文将详细讲解如何在Java中解析XML,特别是针对多级结构的情况。 首先,Java提供了两种主要的API来处理XML:...
XMLBean API是一个强大的Java库,由Apache软件基金会开发,它允许开发者将XML文档直接映射到Java对象,以及反之亦然。这个API提供了一种高效、类型安全的方式来处理XML数据,使得XML文档的读取、写入和操作变得更加...
XMLBean是Apache软件基金会开发的一个Java库,它允许开发者通过简单的API来操作XML文档,将XML数据绑定到Java对象上,以及将Java对象序列化为XML。XMLBean提供了高效的、类型安全的方式来处理XML文档,无需深入理解...
JSTL,全称为JavaServer Pages Standard Tag Library,是Java EE平台中一个用于简化JSP开发的库,它提供了一系列预定义的标签,帮助开发者在JSP页面上进行数据处理、控制流程、XML操作等任务,从而降低对脚本语言的...
XMLBean是Apache软件基金会开发的一款Java库,它允许开发者直接在Java对象和XML文档之间进行映射,大大简化了XML数据的处理。本实例将带你走进XMLBean的世界,通过实践来学习其基本用法和核心概念。 XMLBean的入门...
1. **解析XML**:Java中使用DOM(文档对象模型)、SAX(简单API for XML)或StAX(流式API for XML)等解析器读取XML文件并将其转化为内存中的对象结构。DOM一次性加载整个XML文档,适合小文件;SAX事件驱动,逐行...
5. **解析XML到Java对象**:调用`Unmarshaller.unmarshal()`方法,传入XML文件的输入源,得到对应的Java对象。 6. **反向操作**:如果需要将Java对象转换回XML,可以创建`Marshaller`,然后调用`Marshaller.marshal...
1. **加载XML文件**:使用Java的DOM(Document Object Model)或SAX(Simple API for XML)库读取并解析XML文件。DOM将整个XML文件加载到内存中形成一棵树形结构,便于操作;SAX则是事件驱动的解析方式,只在遇到...
java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 ...
XMLBean和XMLStream是两种处理XML数据与Java对象之间转换的工具,它们在Java开发中广泛用于解析XML文档和创建Java对象。这两种方法各有特点,适用于不同的场景。 XMLBean是Apache软件基金会的Cocoon项目的一部分,...
"基于Java的实例开发源码-Message-Driven Bean EJB实例源代码.zip" 这个标题揭示了本次讨论的核心内容,即一个关于Java编程的实例项目,特别是涉及了Java企业版(Java EE)中的Message-Driven Bean(MDB)组件。...
Java提供了内置的API用于XML解析,如JAXB(Java Architecture for XML Binding),DOM4J,XOM,以及Apache的Commons Digester和XMLBeans等。其中,JAXB用于对象和XML之间的自动转换,方便数据绑定;DOM4J和XOM是基于...
尽管XMLBean提供了便利的API,但它的性能相比DOM和SAX解析器可能会稍逊一筹。对于大型XML文件,可能需要考虑使用StAX或JAXB等其他解析技术。然而,XMLBean在处理复杂的数据模型和保持数据一致性方面具有优势。 6. ...
- **DOM解析**:解析XML文档,创建一个Document对象,然后遍历XML节点,调用JavaBean的setter方法设置属性值。 - **SAX(Simple API for XML)**:非回溯事件驱动的解析方式,根据XML事件调用相应的处理函数,逐个...
然后,可以使用JAXBContext和Unmarshaller来解析XML并创建Bean对象: ```java JAXBContext jaxbContext = JAXBContext.newInstance(Employee.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller...
3. **解析XML到BEAN**:最后,使用Unmarshaller的`unmarshal`方法将XML文档解析为BEAN对象。 ```java Person person = (Person) unmarshaller.unmarshal(new File("person.xml")); ``` 相反,从BEAN到XML的转换...
在描述的代码中,可能包含了一个自定义的类加载器,这是为了动态加载Java类,以便在运行时解析XML文件并实例化对应的Bean对象。类加载器可以根据XML文件中的标签信息找到对应的类并进行实例化,这在处理大量或动态...