红泥小火炉


xmlbean

Nathaniel 848浏览 0条评论
首页/正文
分享到: / / / /

简介

​ xml解析和构建是程序中常见的操作,常见的xml解析技术有Dom4J,SAX等,各自均有适用的场景和约束。在java的开发中,一切都是对象,常需要一种技术能够实现xml-bean之间的转换,简言之,就是将xml当作简单的对象去操作,极大便捷了对xml的解析过程,而xmlbean就可以满足这样的需求。

​ 官方网址为:http://xmlbeans.apache.org/

目录结构

​ 下载之后的目录结构为下图所示: 和常规的软件目录一致;bin目录下存放相关执行文件;docs目录下存放文档信息;lib下存放所涉及的jar包;schemas目录下存放一些案例的xsd文件;src下应该存放的是源码信息,但是在此安装文件中存放的依然是xsd文件。 安装配置

​ 解压之后即可使用,配置环境变量之后,方便使用,配置环境变量在此不做描述。

​ 配置完成之后,在命令行中使用scomp命令,出现下图所示,即为安装配置成功: 使用方法

​ 本文将以一个根节点为students的xml为例进行说明,具体的xml样例如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student id="1">
		<name>召阳爵</name>
		<age>24</age>
		<sex>男</sex>
	</student>
	<student id="2">
		<name>锦爵</name>
		<age>25</age>
		<sex>女</sex>
	</student>
	<school>www.zhaoyangjue.site</school>
</students>
	1.根据接口协议或者xml样例,生成对应的.xsd文件(具体的.xsd如何生成,不在本篇中描述);
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
	<xs:element name="students">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="student" type="student" maxOccurs="unbounded"/>
				<xs:element name="school" type="xs:string"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:complexType name="student">
		<xs:sequence>
			<xs:element name="name" type="xs:int"/>
			<xs:element name="age" type="xs:string"/>
			<xs:element name="sex" type="xs:string"/>
		</xs:sequence>
		<xs:attribute name="id" type="xs:string"/>
	</xs:complexType>
</xs:schema>
	2.构造.xsdconfig文件:文件中指定了包路径
<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">
  <xb:namespace>
    <xb:package>site.zhaoyangjue.demo</xb:package>
 </xb:namespace>
</xb:config>

​ 3.使用scomp命令构造对应的jar包;

scomp -src build/src -out E:/incubated-xmlbeans-1.0.0/test/test/students.jar E:/incubated-xmlbeans-1.0.0/test/test/students.xsd -compiler D:/jdk/jdk1.6.0_34/bin/javac E:/incubated-xmlbeans-1.0.0/test/students.xsdconfig

注意:scomp命令是生成对应jar包的编译命令;完整的格式如下:

scomp [options] [dirs]* [schemaFile.xsd]* [service.wsdl]* [config.xsdconfig]*

主要参数说明:

-src [dir] -- 生成的Java Classes存放目录
-srconly -- 不编译Java Classes,不产生Jar文件
-out [jarFileName] -- 生成的Jar文件,缺省是xmltypes.jar
-compiler -- Java编译器的路径,即Javac的位置
schemaFile.xsd -- XML Schema文件位置
config.xsdconfig -- xsdconfig文件的位置, 这个文件主要用来制定生成的Java Class的一些文件名规则和Package的名称

在本例中,-out 后面指定生成的jar包名为students.jar,涉及到的路径均为绝对路径;后面指定对应的.xsd文件所在的路径,-compiler指定对应的jdk中javac,最后指定了.xsdconfig文件的绝对路径;

需要特别说明的是,如果所需要生成的jar包依赖多个xsd文件约束,则在xsd文件路径中以*.xsd作为xsd路径;

例如,如果students.jar需要依赖多个.xsd文件生成,则将多个.xsd文件放置在同一文件下(例如E:/incubated-xmlbeans-1.0.0/test/test/*.xsd);

在命令行中执行对应的命令,即可生成的jar包;本文中需要的文件都以students作为文件名。

生成的jar包中类文件所在的路径即为第二步中指定的包路径:site.zhaoyangjue.demo,此处需要注意的是如果在.xsd文件中约定有命名空间,则此处的路径不生效,jar包中实现类的路径为命名空间表示的路径。 ​ 4.在工程中使用生成的jar包对xml样例报文进行解析,工程需要的依赖为xmlbean安装文件中的lib文件夹下的jar包,以及生成的待解析的students.jar包;

<dependency>
  <groupId>xmlbeans</groupId>
  <artifactId>xbean</artifactId>
  <version>2.2.0</version>
</dependency>
<dependency>
  <groupId>xmlbeans</groupId>
  <artifactId>xbean_xpath</artifactId>
  <version>2.2.0</version>
</dependency>
<dependency>
  <groupId>jaxen</groupId>
  <artifactId>jaxen</artifactId>
  <version>1.2.0</version>
</dependency>
<dependency>
   <groupId>site.zhaoyangjue</groupId>
   <artifactId>xmlbean-students</artifactId>
   <version>1.0.0</version>
</dependency>

​ 5.解析对应xml样例;

package main.java.site.zhaoyangjue.test;

import org.apache.xmlbeans.XmlException;
import site.zhaoyangjue.demo.StudentType;
import site.zhaoyangjue.demo.StudentsDocument;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class XmlBeanTestForQuery {
    public static void main(String[] args) throws IOException, XmlException {
        StudentsDocument studentRoot = StudentsDocument.Factory.parse(new FileInputStream(new File("src/main/resources/students.xml")));
        StudentsDocument.Students students = studentRoot.getStudents();
        StudentType[] studentArray = students.getStudentArray();
        String school = students.getSchool();
        System.out.println("当前学校为:" + school);
        if (studentArray != null && studentArray.length > 0){
            for (int i = 0;i < studentArray.length;i++){
                System.out.println("当前学生学号为:" + studentArray[i].getId());
                System.out.println("当前学生姓名为:" + studentArray[i].getName());
                System.out.println("当前学生年龄为:" + studentArray[i].getAge());
                System.out.println("当前学生性别为:" + studentArray[i].getSex());
                System.out.println("------------------------------------------");
            }
        }
    }
}
// 获取到的结果如下:
当前学校为:www.zhaoyangjue.site
当前学生学号为:1
当前学生姓名为:召阳爵
当前学生年龄为:24
当前学生性别为:男
------------------------------------------
当前学生学号为:2
当前学生姓名为:锦爵
当前学生年龄为:25
当前学生性别为:女
------------------------------------------

​ 修改学号为1的学生姓名为zhaoyangjue;并将生成的xml文件保存在resources目录下,覆盖原来的xml文件;

package main.java.site.zhaoyangjue.test;

import org.apache.xmlbeans.XmlException;
import site.zhaoyangjue.demo.StudentType;
import site.zhaoyangjue.demo.StudentsDocument;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class XmlBeanTestForModified {
    public static void main(String[] args) throws IOException, XmlException {
        StudentsDocument studentRoot = StudentsDocument.Factory.parse(new FileInputStream(new File("src/main/resources/students.xml")));
        StudentsDocument.Students students = studentRoot.getStudents();
        StudentType[] studentArray = students.getStudentArray();
        String school = students.getSchool();
        System.out.println("当前学校为:" + school);
        if (studentArray != null && studentArray.length > 0){
            for (int i = 0;i < studentArray.length;i++){
                String id = studentArray[i].getId();
                if ("1".equals(id)){
                    studentArray[i].setName("zhaoyangjue");
                }
            }
        }
        // 将修改之后的文件进行保存写入;
        Path path = Paths.get("src/main/resources/students.xml");
        byte[] strToBytes = studentRoot.toString().getBytes();
        Files.write(path, strToBytes);
        // 读取id为1的学生信息;
        StudentsDocument newStudentRoot = StudentsDocument.Factory.parse(new FileInputStream(new File("src/main/resources/students.xml")));
        StudentsDocument.Students newStudents = studentRoot.getStudents();
        StudentType[] newStudentArray = students.getStudentArray();
        if (studentArray != null && studentArray.length > 0){
            for (int i = 0;i < studentArray.length;i++){
                String id = studentArray[i].getId();
                if ("1".equals(id)){
                    System.out.println("当前学生姓名为:" + studentArray[i].getName());
                    System.out.println("当前学生年龄为:" + studentArray[i].getAge());
                    System.out.println("当前学生性别为:" + studentArray[i].getSex());
                }
            }
        }
    }
}
// 最终输出结果为:
当前学校为:www.zhaoyangjue.site
当前学生姓名为:zhaoyangjue
当前学生年龄为:24
当前学生性别为:男
	在已有的xml中增加一个新的学生节点:
package main.java.site.zhaoyangjue.test;

import org.apache.xmlbeans.XmlException;
import site.zhaoyangjue.demo.StudentType;
import site.zhaoyangjue.demo.StudentsDocument;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class XmlBeanTestForInsert {
    public static void main(String[] args) throws IOException, XmlException, InterruptedException {
        StudentsDocument studentRoot = StudentsDocument.Factory.parse(new FileInputStream(new File("src/main/resources/students.xml")));
        StudentsDocument.Students students = studentRoot.getStudents();
        StudentType[] studentArray = students.getStudentArray();
        StudentType studentType = students.addNewStudent();
        studentType.setId("3");
        studentType.setName("张三");
        studentType.setAge(24);
        studentType.setSex("男");
        // 将修改之后的文件进行保存写入;
        Path path = Paths.get("src/main/resources/students.xml");
        byte[] strToBytes = studentRoot.toString().getBytes();
        Files.write(path, strToBytes);
    }
}
// 查看xml文件:
<students>
  <student id="1">
    <name>zhaoyangjue</name>
    <age>24</age>
    <sex>男</sex>
  </student>
  <student id="2">
    <name>锦爵</name>
    <age>25</age>
    <sex>女</sex>
  </student>
  <student id="3">
    <name>张三</name>
    <age>24</age>
    <sex>男</sex>
  </student>
  <school>www.zhaoyangjue.site</school>
</students>

​ 将id为3的学生信息去掉:

package main.java.site.zhaoyangjue.test;

import org.apache.xmlbeans.XmlException;
import site.zhaoyangjue.demo.StudentType;
import site.zhaoyangjue.demo.StudentsDocument;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class XmlBeanTestForDelete {
        public static void main(String[] args) throws IOException, XmlException {
            StudentsDocument studentRoot = StudentsDocument.Factory.parse(new FileInputStream(new File("src/main/resources/students.xml")));
            StudentsDocument.Students students = studentRoot.getStudents();
            StudentType[] studentArray = students.getStudentArray();
            if (studentArray != null && studentArray.length > 0){
                for (int i = 0;i < studentArray.length;i++){
                    String id = studentArray[i].getId();
                    if ("3".equals(id)){
                        studentArray[i].setNil();
                    }
                }
            }

            // 将修改之后的文件进行保存写入;
            Path path = Paths.get("src/main/resources/students.xml");
            byte[] strToBytes = studentRoot.toString().getBytes();
            Files.write(path, strToBytes);
        }
}
// 查看xml文件为:
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <student id="1">
    <name>zhaoyangjue</name>
    <age>24</age>
    <sex>男</sex>
  </student>
  <student id="2">
    <name>锦爵</name>
    <age>25</age>
    <sex>女</sex>
  </student>
  <student id="3" xsi:nil="true"/>
  <school>www.zhaoyangjue.site</school>
</students>

​ 生成一个新的报文样例:

package main.java.site.zhaoyangjue.test;

import org.apache.xmlbeans.XmlException;
import site.zhaoyangjue.demo.StudentType;
import site.zhaoyangjue.demo.StudentsDocument;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class XmlBeanTestForCreate {
        public static void main(String[] args) throws IOException, XmlException {
            StudentsDocument studentsDocument = StudentsDocument.Factory.newInstance();
            StudentsDocument.Students students = studentsDocument.addNewStudents();
            StudentType studentType = students.addNewStudent();
            studentType.setId("001");
            studentType.setSex("男");
            studentType.setAge(10);
            studentType.setName("oldboy");
            // 将修改之后的文件进行保存写入;
            Path path = Paths.get("src/main/resources/new-students.xml");
            byte[] strToBytes = studentsDocument.toString().getBytes();
            Files.write(path, strToBytes);

        }
}
// 生成的new-students.xml内容如下:
<students>
  <student id="001">
    <name>oldboy</name>
    <age>10</age>
    <sex>男</sex>
  </student>
</students>
最后修改: © 著作权归作者所有
上一篇

评论列表

还没有人评论哦~赶快抢占沙发吧~

博客信息

  • 文章数目 12
  • 标签数目 7
  • 运行天数
  • 最后活动

广告

文章目录