Java 操作 XML(11)--XMLBeans 使用

XMLBeans 是一个 XML-Java 绑定工具,它可以很方便地解析 XML 及生成 XML。本文主要介绍 XMLBeans 的基本使用,文中所使用到的软件版本:Java 1.8.0_181、XMLBeans 4.0.0。

1、XMLBeans简介

XMLBeans 是Apache的一个开源项目主要实现将java对象和XML绑定的功能,类似 JAXB;官网地址:http://xmlbeans.apache.org/index.html。

使用 XMLBeans 处理XML大概有如下几个步骤:

a、xml 文件转换成 xsd 文件
b、使用XMLBeans的scomp命令生成对应的jar
c、把生成的jar导入classpath,解析或生成XML

2、XMLBeans使用

2.1、XML样例文件(sutdent.xml)

<?xml version="1.0" encoding="utf-8" ?>
<school:grade xmlns:school="http://www.w3.org/TR/html4/school/">
    <school:student rollno="1" age="11">
        <school:firstname>cxx1</school:firstname>
        <school:lastname>Bob1</school:lastname>
        <school:nickname>stars1</school:nickname>
        <school:marks>85</school:marks>
    </school:student>
    <school:student rollno="2" age="12">
        <school:firstname>cxx2</school:firstname>
        <school:lastname>Bob2</school:lastname>
        <school:nickname>stars2</school:nickname>
        <school:marks>85</school:marks>
    </school:student>
    <school:student rollno="3" age="13">
        <school:firstname>cxx3</school:firstname>
        <school:lastname>Bob3</school:lastname>
        <school:nickname>stars3</school:nickname>
        <school:marks>85</school:marks>
    </school:student>
</school:grade>

2.2、XML转XSD(sutdent.xsd)

XML转XSD可以使用XMLSpy等工具来处理,这里使用在在线的转换工具来处理(https://www.freeformatter.com/xsd-generator.html),转换后的xsd如下:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.w3.org/TR/html4/school/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="grade">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="student" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="firstname"/>
              <xs:element type="xs:string" name="lastname"/>
              <xs:element type="xs:string" name="nickname"/>
              <xs:element type="xs:byte" name="marks"/>
            </xs:sequence>
            <xs:attribute type="xs:byte" name="rollno" use="optional"/>
            <xs:attribute type="xs:byte" name="age" use="optional"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

2.3、xsdconfig配置文件(student.xsdconfig)

xsd配置文件(后缀为.xsdconfig)主要用来制定生成的Java Class的一些文件名规则和Package的名称:

<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">
  <xb:namespace>
    <xb:package>com.abc.demo.general.xml</xb:package>
  </xb:namespace>
</xb:config>

xsd文件中如果有命名空间,生成的包名是根据命名空间来的;xsdconfig配置不起作用。

2.4、使用XMLBeans的scomp命令生成jar包

C:\Users\wuyy\Downloads\xmlbeans-4.0.0\bin\scomp -out student.jar -compiler D:\soft\Java\jdk1.8.0_181\bin\javac student.xsd student.xsdconfig

 参数说明:

-src [dir]            -- 生成的Java源文件存放目录 
-srconly              -- 只生成Java源文件
-out [jarFileName]    -- 生成的Jar文件,缺省是xmltypes.jar 
-compiler             -- Java编译器的路径,即Javac的位置 
schemaFile.xsd        -- XML Schema文件位置 
config.xsdconfig      -- xsdconfig文件的位置

2.5、使用XMLBeans解析或生成XML

把生成的student.jar导入classpath,使用XMLBeans生成的中间类来解析或生成XML。

package com.abc.demo.general.xml;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3.tr.html4.school.GradeDocument;

import java.util.List;

/**
 * XMLBeans使用
 */
public class XMLBeansCase {
    private static Logger logger = LoggerFactory.getLogger(XMLBeansCase.class);

    /**
     * java对象转成xml
     * @throws Exception
     */
    @Test
    public void javaToXml() throws Exception {
        GradeDocument document = GradeDocument.Factory.newInstance();
        GradeDocument.Grade grade = document.addNewGrade();
        GradeDocument.Grade.Student student1 = grade.addNewStudent();
        student1.setRollno((byte) 1);
        student1.setAge((byte) 10);
        student1.setFirstname("cxx1");
        student1.setLastname("Bob1");
        student1.setNickname("stars1");
        student1.setMarks((byte) 85);

        GradeDocument.Grade.Student student2 = grade.addNewStudent();
        student2.setRollno((byte) 2);
        student2.setAge((byte) 11);
        student2.setFirstname("cxx2");
        student2.setLastname("Bob2");
        student2.setNickname("stars2");
        student2.setMarks((byte) 85);

        GradeDocument.Grade.Student student3 = grade.addNewStudent();
        student3.setRollno((byte) 3);
        student3.setAge((byte) 12);
        student3.setFirstname("cxx3");
        student3.setLastname("Bob3");
        student3.setNickname("stars3");
        student3.setMarks((byte) 85);

        document.save(System.out);
    }

    /**
     * xml转成java对象
     * @throws Exception
     */
    @Test
    public void xmlToJava() throws Exception {
        GradeDocument document = GradeDocument.Factory.parse(WoodstoxCase.class.getResourceAsStream("student3.xml"));
        GradeDocument.Grade grade = document.getGrade();
        List<GradeDocument.Grade.Student> students = grade.getStudentList();
        for (GradeDocument.Grade.Student student : students) {
            logger.info(student.getRollno() + "|" + student.getAge() + "|" + student.getFirstname() + "|" + student.getLastname() + "|" + student.getNickname());
        }
    }
}

 

posted @ 2021-02-06 14:54  且行且码  阅读(1351)  评论(0编辑  收藏  举报