在解析XML时候,最方便的方法就属 JAXB了。
它可以将一个XML 转换成一个POJO 实例,也可以将一个POJO 实例写入XML文件,而且可以不需要xsd、DTD等文件。当然JAXB也可以通过 XSD 文件自动生成 POJO 类。
对于已知格式的XML分析,这是最简单的方法了。
最重要的方法就是 toXML 和 createInstanceFromXML,以及是POJO类中 XML无素的声明。
@Xml..... 的声明,可以放在setter 或 getter 方法上,任何一个都可以。
但不要把声明放在成员变量上,这将导致出错。
那么把成员变量声明为public 也会导致 IllegalAnnotationExceptions。
下面是一个主要的POJO类 。
import java.io.Reader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Customer {
String name;
int age;
int id;
private Address contact;
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
@XmlElement
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
@XmlAttribute
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return String.format("%s[id=%d,name=%s,age=%d,contact=%s", getClass().getName(), getId(), getName(), getAge(), getContact());
}
@XmlElement
public Address getContact() {
return contact;
}
public void setContact(Address contact) {
this.contact = contact;
}
public String toXML() throws JAXBException {
//writer,用于保存XML内容
StringWriter writer = new StringWriter();
//获取一个关于Customer类的 JAXB 对象
JAXBContext context = JAXBContext.newInstance(Customer.class);
//由 Jaxbcontext 得到一个Marshaller(马歇尔)
Marshaller marshaller = context.createMarshaller();
//设置为格式化输出,就是XML自动格式化。
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//使用marshaller将对象输出到writer。
marshaller.marshal(this, writer);
//writer.toString(),将所有写入的内容转成String
return writer.toString();
}
public static Customer createInstanceFromXML(Reader reader) throws JAXBException {
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
//marshaller是类到XML 的转化,那么 unmashaller是XML到类的转化。
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customer customer = (Customer) jaxbUnmarshaller.unmarshal(reader);
return customer;
}
}
下面是Customer中引用到的POJO类。
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
public class Address {
private String addr;
private String postno;
private int id;
@Override
public String toString(){
return String.format("Address[%s,%s,%d]", addr,postno,id);
}
public Address() {
setAddr("default");
setPostno("000000");
setId(1);
}
@XmlElement
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@XmlElement
public String getPostno() {
return postno;
}
public void setPostno(String postno) {
this.postno = postno;
}
@XmlAttribute
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
最后,我们测试一下这个Customer类。
Customer customer = new Customer();
customer.setId(100);
customer.setName("jaxbExample");
customer.setAge(20);
customer.setContact(new Address());
//将Customer对象输出XML信息
System.out.println(customer.toXML());
//从XML文件生成一个Customer对象
File file = new File("d:\\tmp\\file.xml");
java.io.InputStreamReader sr = new InputStreamReader(new FileInputStream(file));
Customer cust = Customer.createInstanceFromXML(sr);
sr.close();
System.out.println(cust);
结果,它很好的运行了。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="100">
<age>20</age>
<contact id="1">
<addr>default</addr>
<postno>000000</postno>
</contact>
<name>jaxbExample</name>
</customer>
Customer[id=100,name=jaxbExample,age=20,contact=Address[default,000000,1]
继续,再来看看Address类,类里也有XML声明。如果把Address类中的XML声明都去除,JAXB仍可以正常执行,只是Address类的成员都自动变成了XML的contact下的Element。
那么从执行来看,只要没有特殊要求,Address类不需要声明,任何的POJO类都可以被Marshaller。只需要把类声明为@XmlRootElement 就可以,其它的都不需要声明。下面给出一个运行结果。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pJaxb>
<contact>
<addr>default</addr>
<id>1</id>
<postno>000000</postno>
</contact>
<name>name1</name>
<pass>pass2</pass>
</pJaxb>
@XmlRootElement
public class PJaxb {
private String name;
private String pass;
private Address contact;
//以下略去 3个setter和getter对,没有XML声明,toXML方法。
分享到:
相关推荐
NULL 博文链接:https://luyuwww.iteye.com/blog/1988355
jaxb将xml转换为对象或将对象转换为xml。测试通过。
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。JAXB与xml相互转换实例。
JAXB工具类 xml转为java对象 java对象转为xml ,本人亲测,可以使用!!!
jaxb xml 转map
使用jaxb生成XML例子,含有例子和注解解析
jaxb XMl和BEAN互转实例(内含jar包),将jaxb封装成一个Util工具类,只需要通过对BEAN进行简单的注解就可以直接实现xml和bean之间的互转
教你使用jaxb解析xml,介绍了主要的注解,以及核心api
JAXB XML TO JAVA,文件转化 生成java代码
使用java jdk的JAXB技术实现xml与java对象互相转化代码教程: JDK中JAXB相关的重要Class和Interface:(来源于百度百科JAXB) •JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。 •Marshaller接口,将Java...
JAXB教程 JAXB JAXB插件 里面有很详细的使用说明,看了就知道,JAXB解析XML真的很好用
Java XML绑定架构(JAXB)提供了一个绑定编译器,xjc,来从一个XML模式中生成Java类。用JAXB的xjc生成的Java类代表了在XML模式中不同的元素和复杂类型(complexType)。(一个复杂类型通过指定属性和元素内的元素来提供对...
jaxb 将xml里面的对象转化为一个个类,大大地简化了xml的相关操作。unmarshal marshal
JAXB注解 java 关于xml的注解,自动生成xml文件
使用jaxb 实现xml——bean互转
java 使用 JAXB 将xml转换为 bean 包含xml和dto和读取文件的util类
jaxb解析生成xml例子
使用woodstax+jaxb进行xml的流解析,包括解析类,解析文件,所需jar包,带注解的实体类。提高了解析效率,减少了内存消耗。
NULL 博文链接:https://xiongpan0807.iteye.com/blog/1832124
我刚写好的 一个简单的小程序 动行里面的read文件 是在idea 中用jaxb 读xml中数据