`
salever
  • 浏览: 255768 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一种解析XML 的可选方案 —— betwixt

XML 
阅读更多

使用apche 的 betwixt,相关库为

Ø      commons-beanutils.jar

Ø      commons-betwixt-1.0-beta-1.jar

Ø      commons-collections-3.2.1.jar

Ø      commons-configuration-1.6.jar

Ø      commons-digester.jar

Ø      commons-lang-2.4.jar

Ø      commons-logging.jar

比如解析如下XML:

 <?xml version="1.0" encoding="UTF-8" ?>
 <class id="1" name="class one">
    <students>
          <student name="Jime">
                  <score maths="80" />
             </student>
          <student name="Abby">
                    <score maths="100" />
       </student>
      </students>
  </class>

 结构很简单,这里使用betwixt 方式进行解析。

首先封装XML 的元素信息,主要为3个类:

Class.java

public class Class {

       private int id;

       private String name;

       private List<Student> students = new ArrayList<Student>();

       /**
        * Add a student.
        * @param student
        */
       public void addStudent(Student student){
          this.students.add(student);
       }    

       /**
        * Remove a student.
        * @param student
        */
       public void removeStudent(Student student){
              this.students.remove(student);
       }

       /**
        * @return the id
        */

       public int getId() {
              return id;
       }

       /**
        * @param id the id to set
        */
       public void setId(int id) {
              this.id = id;
       }

       /**
        * @return the name
        */
       public String getName() {
              return name;
       }

       /**
        * @param name the name to set
        */
       public void setName(String name) {
              this.name = name;
       }

       /**
        * @return the students
        */
       public List<Student> getStudents() {
              return students;
       }

       /**
        * @param students the students to set
        */
       public void setStudents(List<Student> students) {
              this.students = students;
       }

}

 Student.java

public class Score {

       private int mathScore;

       /**
        * @return the mathScore
        */
       public int getMathScore() {
              return mathScore;
       }

       /**
        * @param mathScore the mathScore to set
        */
       public void setMathScore(int mathScore) {
              this.mathScore = mathScore;
       }

}

 

都很简单,就不用多描述了。下面是每个类对应的XML 描述文件:

Class.betwixt:

<?xml version="1.0" encoding="UTF-8"?>
<info primitiveTypes="attribute">
       <element name="class">
           <attribute name="id" property="id"/>
             <attribute name="name" property="name"/>
              <element name="students">
                 <element name="student" property="student"/>
              </element>           
              <addDefaults/>
       </element>
</info>

 Student.betwixt:

<?xml version="1.0" encoding="UTF-8"?>
<info primitiveTypes="attribute">
       <element name="student">
              <attribute name="name" property="name"/>      
              <element name="score" property="score"/>       
              <addDefaults/>
       </element>
</info>

 Score.betwixt:

<?xml version="1.0" encoding="UTF-8"?>
<info primitiveTypes="attribute">
       <element name="score">
              <attribute name="maths" property="mathScore"/>
              <addDefaults/>
       </element>
</info>

 这些XML 文件名与类名相同,用来在XML 文件与实体类之间进行映射。具体的解析方法就很简单了。注意这些文件需要跟.java文件放到同一目录下。

 

public static Object fromXml(InputStream in, Class clazz)
                     throws XmlException {

              BeanReader beanReader = new BeanReader();
             Object object = null;
              try {
                     beanReader.registerBeanClass(clazz);
                    beanReader.getXMLIntrospector().setWrapCollectionsInElement(true);
                     object = beanReader.parse(in);
              } catch (Exception e) {
                     throw new XmlException(e);
              }
              return object;
       }

 使用fromXml 解析文件:

public static Class parseFromXml(String path) throws Exception {

              FileInputStream in;
              Class obj = null;
              try {
                     in = new FileInputStream(path);
                     obj = (Class) XmlUtil.fromXml(in, Class.class);
              } catch (FileNotFoundException e) {
                     throw new Exception(e);
              } catch (Exception e) {
                     throw new Exception(e);
              }

              return obj;
       }

 输出为XML:

public static void toXml(Object object, OutputStream out)
                     throws Exception {
              try {
                     BeanWriter beanWriter = new BeanWriter(out, "UTF-8");               
beanWriter.enablePrettyPrint();
beanWriter.setIndent("    ");                                              
beanWriter.setEndOfLine(System.getProperty("line.separator"));                   
beanWriter.writeXmlDeclaration("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");   
                  beanWriter.getXMLIntrospector().setWrapCollectionsInElement(true);
                     beanWriter.setWriteEmptyElements(false);
                     beanWriter.write(object);
                     beanWriter.close();
              } catch (Exception e) {
                     throw new XmlException(e);
              }
   }

 
将Class 类的对象输出为XML:

public static void writeToXml(Object object, String path)
                     throws Exception {

              try {
                     FileOutputStream out = new FileOutputStream(path);
                     XmlUtil.toXml(object, out);
                     out.close();
              } catch (FileNotFoundException e) {
                     throw new Exception(e);
              } catch (IOException e) {
                     e.printStackTrace();
              }
       }

 完成XML 解析的过程很简单,就只有几句话而以,这对于大型复杂的XML 解析很有帮助,不需要亲自处理各种属性、元素等,因为各种.jar 文件已经封装好了。

2
0
分享到:
评论
5 楼 mercyblitz 2010-07-13  
salever 写道
mercyblitz 写道
salever 写道
mercyblitz 写道
JAXB 不就可以吗?

没用过jaxb,刚看了下,跟这个类似,估计思路是一样的,用哪个就随自己喜好了。

某用过几次betwixt, 不管是大型的XML文件还是比较复杂的XML文件。性能和功能都还不错。

关键是读写机制,是否使用了Stream XML,对性能很有影响。

还真没用过XStream,下次有机会试试,再来跟你交流。




4 楼 salever 2010-07-13  
mercyblitz 写道
salever 写道
mercyblitz 写道
JAXB 不就可以吗?

没用过jaxb,刚看了下,跟这个类似,估计思路是一样的,用哪个就随自己喜好了。

某用过几次betwixt, 不管是大型的XML文件还是比较复杂的XML文件。性能和功能都还不错。

关键是读写机制,是否使用了Stream XML,对性能很有影响。

还真没用过XStream,下次有机会试试,再来跟你交流。
3 楼 mercyblitz 2010-07-13  
salever 写道
mercyblitz 写道
JAXB 不就可以吗?

没用过jaxb,刚看了下,跟这个类似,估计思路是一样的,用哪个就随自己喜好了。

某用过几次betwixt, 不管是大型的XML文件还是比较复杂的XML文件。性能和功能都还不错。

关键是读写机制,是否使用了Stream XML,对性能很有影响。
2 楼 salever 2010-07-13  
mercyblitz 写道
JAXB 不就可以吗?

没用过jaxb,刚看了下,跟这个类似,估计思路是一样的,用哪个就随自己喜好了。

某用过几次betwixt, 不管是大型的XML文件还是比较复杂的XML文件。性能和功能都还不错。
1 楼 mercyblitz 2010-07-12  
JAXB 不就可以吗?

相关推荐

    XML操作之betwixt

    XML(eXtensible Markup Language)是一种用于存储和交换数据的标记语言,广泛应用于软件开发、数据存储和网络通信等领域。Betwixt是Apache软件基金会的一个项目,它提供了一个简单而直观的方式来映射XML文档到Java...

    使用betwixt进行xml与java类之间的互转解析--代码

    在Java开发中,XML作为一种通用的数据交换格式,广泛用于存储和传输数据。为了方便地将XML文档转换为Java对象,以及将Java对象序列化为XML,Apache软件基金会提供了一个名为Betwixt的库。本篇文章将深入探讨如何使用...

    betwixt文件解析bai

    Betwixt是Apache软件基金会的一个项目,提供了一种简单的方法来将XML数据映射到Java对象,以及反向操作,即将Java对象转换回XML。这个过程被称为对象-XML绑定,有助于简化数据序列化和反序列化的任务。 标题...

    xml操作之betwixt实例

    XML(Extensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件和文档存储等领域。在Java开发中,处理XML时,Betwixt是一个非常有用的库,它由Apache软件基金会提供,主要用于对象到XML...

    使用Betwixt将XML转为JAVA Bean(内有JAR包)

    总之,Betwixt提供了一种方便的方式来处理Java对象与XML之间的转换,即使在XML中存在相同节点名的情况下也能有效处理。通过配置和API的使用,开发者可以根据需要定制XML和Java Bean之间的映射规则,提高代码的可读性...

    java使用commons-betwixt 实现bean与xml互转

    Apache Commons Betwixt是Apache软件基金会的一个项目,它为Java开发者提供了一种直观的方式来绑定Java Bean和XML。通过这个库,你可以将一个Java对象的属性和XML元素或属性对应起来,反之亦然。这样,你可以轻松地...

    xstream和betwixt对xml、object的互转

    在Java编程领域,XML(Extensible Markup Language)作为一种数据交换和存储格式,广泛应用于系统间的数据传输和配置文件。为了方便地将Java对象与XML进行转换,开发者常常使用一些库,如XStream和Betwixt。这两个...

    javabean和xml互相转换工具类以及jar包

    - **使用第三方库,如Apache Commons Betwixt**:Betwixt是Apache Commons项目的一部分,提供了一种简单的机制来映射Java对象到XML和从XML到Java对象。在提供的`commons-betwixt-0.8.jar`中,包含了Betwixt库,可以...

    betwixt详细使用说明

    总的来说,Betwixt 是一个轻量级的解决方案,适合快速地在 Java beans 和 XML 之间进行简单的转换。如果你的项目只需要基础的 XML-Bean 映射功能,Betwixt 是一个不错的选择。但如果你需要更高级的功能,可能需要...

    betwixt技术

    总之,Betwixt技术是Java世界中的一种XML绑定解决方案,它简化了XML数据与Java对象之间的转换过程,但随着技术的发展,其他更强大、更现代的库已经逐渐取代了它的位置。如果你在旧项目中遇到Betwixt,理解其工作原理...

    xml转换java对象

    XML(eXtensible Markup ...Apache Commons Betwixt提供了一种灵活且易于使用的解决方案,使得在Java中处理XML数据变得更加便捷。通过深入学习和实践,你可以更好地掌握XML到Java对象的转换技巧,提升你的开发效率。

    commons-betwixt-0.8的相关文件

    Apache Commons Betwixt 是一个Java库,它提供了一种方式来映射XML文档到Java对象,反之亦然。这个库使得开发人员可以方便地在XML数据和Java对象之间进行转换,大大简化了数据交换和序列化的过程。"commons-betwixt-...

    commons-betwixt-0.8.rar源文件及jar包

    Apache Commons Betwixt 是一个Java库,它提供了一种简单的方式来映射对象到XML以及从XML反向映射回对象。这个库是基于Apache软件基金会的Jakarta Commons项目,旨在简化XML数据绑定任务,使得开发者可以专注于业务...

    betwixt互相转换JavaBean和XML(含代码和jar包)

    本资料用于JavaBean和XML之间相互转换,所用到的关于betwixt的包都在内。方法写在textXml中,由于默认的方法较为简单,且有局限性,所以本资料主要侧重从自定义的配置文件中转换xml或者生成javaBean.有兴趣的朋友...

    commons-betwixt-0.5-src.zip_ObjectStringConvert_commons-betwixt_

    Apache Commons Betwixt 是一个Java库,它...如果你在项目中需要处理大量的JavaBean到XML的转换工作,那么Betwixt是一个值得考虑的解决方案。同时,研究源代码也能加深对Java反射、XML处理和对象模型映射等技术的理解。

    webservice接口开发obj2xml.zip

    Apache Commons Betwixt是一个Java库,它允许开发者以一种声明式的方式将Java对象映射到XML和从XML反向映射回Java对象。这个库对于处理数据序列化和反序列化非常有用,尤其是在构建基于SOAP的Web服务时。 在"obj2...

    betwixt互相转换JavaBean和XML(含代码和jar包).rar

    本资料用于JavaBean和XML之间相互转换,所用到的关于betwixt的包都在内。方法写在textXml中,由于默认的方法较为简单,且有局限性,所以本资料主要侧重从自定义的配置文件中转换xml或者生成javaBean.有兴趣的朋友...

    commons-betwixt-0.8.jar

    commons-betwixt-0.8.jar

    Websiteconfig

    1. **XML配置文件**:XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,其结构清晰,易于人类阅读和机器解析。在IT行业中,特别是Java应用,经常使用XML文件来存储配置信息,如数据库连接参数...

    MDDwsClient(BetwixtXML的使用)

    Betwixt是Apache软件基金会的一个开源项目,它提供了一种简单的机制来映射Java对象到XML文档,反之亦然。通过注解或者XML配置,开发者可以定义Java类和XML元素之间的映射关系,使得数据交换变得直观且易于维护。 ##...

Global site tag (gtag.js) - Google Analytics