`
xuyiooo
  • 浏览: 73089 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java调用支付平台API--解析XML返回bean

阅读更多
上一篇谈到,如何将遍历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_API1.6文档(中文)

    java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 ...

    java api最新7.0

    JAVA开发人员最新版本7.0 api文档!本文档是 Java Platform Standard Edition 7 的 API !Java 1.7 API的中文帮助文档。 深圳电信培训中心 徐海蛟博士教学用api 7.0中文文档。支持全文检索,在线即时查询。 里面列...

    Java 1.6 API 中文 New

    java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java ...

    JavaAPI1.6中文chm文档 part1

    java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 ...

    JavaAPI中文chm文档 part2

    java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 ...

    play framework 框架手册 word 版

    Java调用定义 - 17 - 把404当作action来用 - 17 - 指派静态参数 - 17 - 变量和脚本 - 18 - 路由优先级 - 18 - 服务器静态资源 - 18 - staticDir: mapping - 18 - staticFile: mapping - 19 - URL 编码 - 19 - 反转...

    play框架手册

    Java调用定义 - 17 - 把404当作action来用 - 17 - 指派静态参数 - 17 - 变量和脚本 - 18 - 路由优先级 - 18 - 服务器静态资源 - 18 - staticDir: mapping - 18 - staticFile: mapping - 19 - URL 编码 - 19 - 反转...

    [Java参考文档].JDK_API 1.6

    java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java ...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    SpringMVC框架搭建及详解.pdf

    * Hibernate 3.6.8:hibernate3.jar、hibernate-jpa-2.0-api-1.0.1.Final.jar、antlr-2.7.6.jar、commons-collections-3.1、dom4j-1.6.1.jar、javassist-3.12.0.GA.jar、jta-1.1.jar、slf4j-api-1.6.1.jar、slf4j-...

    [Java参考文档]

    java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 ...

    java 面试题 总结

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    Java面试宝典-经典

    4、编程用JAVA解析XML的方式. 115 5、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 117 七. 流行的框架与新技术 117 1、谈谈你对Struts的理解。 117 2、谈谈你对Hibernate的理解。 118 ...

    JDK_1_6 API

    java.beans.beancontext 提供与 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 java.lang.annotation 为 Java ...

Global site tag (gtag.js) - Google Analytics