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

使用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 文件已经封装好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值