在java开发中使用XML几乎是每个程序员都会碰到的,目前可供我们选择的库也有很多,包括,dom4j, jaxen, SAX等等,本文将介绍如何使用JAXB进行Object-XML mapping.
JAXB目前已经集成到了JDK6中,但是还是推荐下载使用最新版的jaxb库, https://jaxb.dev.java.net/
从JAXB2.0开始,可以通过使用annotation进行Object-XMl mapping。
本文将通过以下步骤演示如何使用JAXB annotation绑定使用了namespace的XML文件
1. 创建employees.xml文件
2. 创建Employees.java和Employee.java绑定employees.xml
3. 创建package-info.java和jaxb.index文件
4. 创建XMLParser.java封装marshal/unmarshal操作
5. 创建Test.java运行测试
现在将逐步展开演示
1. 创建employees.xml文件
<?xml version="1.0" encoding="utf-8" ?>
<employees xmlns:admin="http://www.company.com/management/employees/admin">
<admin:employee>
<admin:userId>johnsmith@company.com</admin:userId>
<admin:password>abc123_</admin:password>
<admin:name>John Smith</admin:name>
<admin:age>24</admin:age>
<admin:gender>Male</admin:gender>
</admin:employee>
<admin:employee>
<admin:userId>christinechen@company.com</admin:userId>
<admin:password>123456</admin:password>
<admin:name>Christine Chen</admin:name>
<admin:age>27</admin:age>
<admin:gender>Female</admin:gender>
</admin:employee>
</employees>
这是一个很普通的xml文件,用于展示组织内部的成员(employee)状况,这里有一点需要注意的是使用了namespace,这也是本文将要演示的重点。
2. 创建Employees.java和Employee.java绑定employees.xml
package com.javaeye.terrencexu.jaxb;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "employees")
public class Employees {
@XmlElement(name = "employee", namespace=NameSpace.ADMIN_URI)
private List<Employee> employees;
public Employees() {
employees = new ArrayList<Employee>();
}
public List<Employee> getEmployees() {
return employees;
}
public void addEmployee(Employee employee) {
employees.add(employee);
}
}
package com.javaeye.terrencexu.jaxb;
import javax.xml.bind.annotation.XmlElement;
public class Employee {
@XmlElement(name = "userId", namespace=NameSpace.ADMIN_URI)
private String userId;
@XmlElement(name = "password", namespace=NameSpace.ADMIN_URI)
private String password;
@XmlElement(name = "name", namespace=NameSpace.ADMIN_URI)
private String name;
@XmlElement(name = "age", namespace=NameSpace.ADMIN_URI)
private int age;
@XmlElement(name = "gender", namespace=NameSpace.ADMIN_URI)
private String gender;
public Employee() {
}
public Employee(String userId, String psw, String name, int age, Gender gender) {
this.userId = userId;
this.password = psw;
this.name = name;
this.age = age;
this.gender = gender.getValue();
}
public String getUserId() {
return userId;
}
public String getPassword() {
return password;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getGender() {
return gender;
}
}
package com.javaeye.terrencexu.jaxb;
public class NameSpace {
public static final String ADMIN_PREFIX = "admin";
public static final String ADMIN_URI = "http://www.company.com/management/employees/admin";
}
package com.javaeye.terrencexu.jaxb;
public enum Gender {
MALE("Male"),
FEMALE("Female");
private String value;
private Gender(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
}
3. 创建package-info.java和jaxb.index文件
创建package-info.java注册xmlns, 将该文件放在当前source code的package下面,如果不使用namespace可以不创建该文件
@XmlSchema(
xmlns={
@XmlNs(prefix=NameSpace.ADMIN_PREFIX, namespaceURI=NameSpace.ADMIN_URI)
}
)
package com.javaeye.terrencexu.jaxb;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlSchema;
创建jaxb.index注册Employees, Employee,如果不使用包级context,可以不创建该文件
Employees
Employee
4. 创建XMLParser.java封装marshal/unmarshal操作
package com.javaeye.terrencexu.jaxb;
import java.io.InputStream;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public final class XMLParser {
private XMLParser() {}
public static Object unmarshal(InputStream xml, Class<?> clazz) {
Object obj = null;
try {
JAXBContext jc = JAXBContext.newInstance(clazz.getPackage().getName());
Unmarshaller u = jc.createUnmarshaller();
obj = u.unmarshal(xml);
} catch (JAXBException e) {
throw new RuntimeException("Can't unmarshal the XML file, error message: " + e.getMessage());
}
return obj;
}
public static String marshal(Object obj, Class<?> clazz) {
String result = null;
try {
JAXBContext jc = JAXBContext.newInstance(clazz.getPackage().getName());
Marshaller m = jc.createMarshaller();
StringWriter writer = new StringWriter();
m.marshal(obj, writer);
result = writer.toString();
} catch (JAXBException e) {
throw new RuntimeException("Can't marshal the XML file, error message: " + e.getMessage());
}
return result;
}
}
5. 创建Test.java运行测试
package com.javaeye.terrencexu.jaxb;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
public class Test {
public static void main(String[] args) throws FileNotFoundException {
testUnmarshal();
testMarshal();
}
public static void testUnmarshal() throws FileNotFoundException {
Employees employees = (Employees) XMLParser.unmarshal(
new FileInputStream(new File("F:\\workspace\\JavaStudy\\test\\employees.xml")),
Employees.class);
List<Employee> employeeList = employees.getEmployees();
if (employeeList != null && employeeList.size() > 0) {
for (Employee employee : employeeList) {
StringBuilder builder = new StringBuilder();
builder.append("[UserID: ").append(employee.getUserId()).append(", ")
.append("Password: ").append(employee.getPassword()).append(", ")
.append("Name: ").append(employee.getName()).append(", ")
.append("Age: ").append(employee.getAge()).append(", ")
.append("Gender").append(employee.getGender()).append("]");
System.out.println(builder.toString());
}
}
}
public static void testMarshal() {
Employees employees = new Employees();
employees.addEmployee(new Employee("johnsmith@company.com", "abc123_", "John Smith", 24, Gender.MALE));
employees.addEmployee(new Employee("christinechen@company.com", "123456", "Christine Chen", 27, Gender.FEMALE));
String result = XMLParser.marshal(employees, Employees.class);
System.out.println(result);
}
}
6. 运行结果:
[UserID: johnsmith@company.com, Password: abc123_, Name: John Smith, Age: 24, GenderMale]
[UserID: christinechen@company.com, Password: 123456, Name: Christine Chen, Age: 27, GenderFemale]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><employees xmlns:admin="http://www.company.com/management/employees/admin"><admin:employee><admin:userId>johnsmith@company.com</admin:userId><admin:password>abc123_</admin:password><admin:name>John Smith</admin:name><admin:age>24</admin:age><admin:gender>Male</admin:gender></admin:employee><admin:employee><admin:userId>christinechen@company.com</admin:userId><admin:password>123456</admin:password><admin:name>Christine Chen</admin:name><admin:age>27</admin:age><admin:gender>Female</admin:gender></admin:employee></employees>
分享到:
相关推荐
JAXB:用于 XML 绑定的 Java 架构 关于 这演示了如何使用 JRuby 来控制 JAXB 类。 它的灵感来自 Jason Gilman 此示例代码侧重于构建和编组以及 XML 文档 JAXB JAXB 是源自 Java Architecture for XML Binding 的首...
XML3D JAXB绑定 这是一堆Java类,可以对的(很小)子集进行。 如XML3D Wiki中所述,它可用于编码普通的“”。
Java XML绑定架构(JAXB)提供了一个绑定编译器,xjc,来从一个XML模式中生成Java类。用JAXB的xjc生成的Java类代表了在XML模式中不同的元素和复杂类型(complexType)。(一个复杂类型通过指定属性和元素内的元素来提供对...
使用jaxb根据xsd生成xml文档,不要积分的,赶快下载
标签:javax、xml、bind、jaxb、api、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...
对于Java8,JAXB(Java XML绑定)API和实现是Java平台和“标准”的一部分。使用Java9时,不建议将其删除,而使用Java11时,最终将其删除。现在应该由其他库提供JAXB API和实现。 在这里,我将总结用于将库带到带有...
使用jaxb生成XML例子,含有例子和注解解析
Jaxb annotation 使用 Jaxb annotation初步使用
解决maven仓库jab1-impl.jar jabl-api.jar jsr173_1.0_api.jar等jar包不存在问题
教你使用jaxb解析xml,介绍了主要的注解,以及核心api
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项...从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
在android 6.0下,应用JAXB jar包根据XML Schema解析XML文件。
jdk升级之后出现异常:java.lang.NoClassDefFoundError: javax/xml/ws/Service 1、解决方案jdk降级至1.8之前 2、由于JDK9以后,去除了javax.xml包需要引入对应的jar包 <groupId>javax.activation <artifactId>...
JAXBDemo 的代码库。 JAXB 代表 Java Architecture for XML Binding,它允许在 XML 和 java 类之间轻松转换。
JAXB工具类 xml转为java对象 java对象转为xml ,本人亲测,可以使用!!!
NULL 博文链接:https://luyuwww.iteye.com/blog/1988355
JAXB的使用JAXB的使用JAXB的使用JAXB的使用
Maven坐标:javax.xml.bind:jaxb-api:2.3.1; 标签:bind、javax、xml、api、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,...
java 源码生成
用于JAXB(用于XML绑定的Java API)架构到源代码的编译器(XJC)的插件,该代码生成代码以通过任意帮助程序类格式化生成的类的实例。 动机 XJC当前有多个插件,可以在生成的JAXB类文件中生成“ toString()”方法。...