在解析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方法。
分享到:
相关推荐
JAXB (Java Architecture for XML Binding) 是Java平台上的一项标准技术,用于将XML文档与Java对象进行绑定,使得XML数据能够方便地在Java程序中使用。XJC是JAXB的一部分,它是一个命令行工具,用于从XML Schema ...
对于XML转换,Jackson有一个名为`JAXB`的模块,可以处理XML与Java对象之间的转换。 3. **JAXB (Java Architecture for XML Binding)** JAXB是Java SE的一部分,用于将Java对象绑定到XML。它支持XML到JavaBean的...
- JAXB允许开发者通过注解将XML Schema与Java类绑定,实现XML到Java对象的自动映射。 - DOM解析器则将整个XML文档加载到内存中,形成一个节点树,然后遍历该树来创建和填充实体Model。 4. **导出实体Model为XML**...
尽管XML序列化在理想情况下应该类似于JAXB输出,但偏差不一定被视为错误-我们会尽力而为 应该保证的是,使用此模块编写的任何XML也必须使用该模块可读:也就是说,我们的目标是进行完整的XML序列化。 从上面开始:...
JAXB允许我们将XML与Java对象之间进行映射,使得可以更方便地处理XML数据。以下是一个简单的JAXB示例: ```java import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind....
它的目的是在 Java 对象(几乎总是一个 plain old Java object,或简写为 POJO)和 XML 文档之间来回转换。 例如,您可能有一个带有几个属性的简单 bean,且您的业务需要将那个 Java 对象转换为一个 XML 文档。...
- 编写Java类:定义你想要与XML数据交互的Java类,这些类可以是简单的POJO(Plain Old Java Object)。 - 序列化和反序列化:使用Castor提供的API,可以将Java对象转换为XML字符串,或将XML文档解析为Java对象。 ...
JAXB允许Java程序与XML数据进行交互,将XML文档转换为Java对象,反之亦然。`xjc`可以读取XSD文件,根据其中定义的数据结构生成对应的Java类。 使用`xjc`的步骤大致如下: 1. 首先,你需要一个符合规范的XSD文件,它...
3. **POJO到Web服务的转换**:JAX-WS支持通过注解将传统的Java对象(POJOs)直接转换为Web服务,极大地加速了开发流程。同时,它还规定了如何将WSDL定义的服务精确映射到实现这些服务的Java类上,即使是复杂的WSDL...
CXF提供了一种简单而强大的方式来创建、消费和管理Web服务,支持多种协议,如SOAP、REST、WS-*规范(如WS-Security、WS-ReliableMessaging等)以及各种数据绑定技术,如JAXB和XMLBeans。 CXF的两大核心组件是服务...
3. **绑定 XML 数据**:使用 JAXB 将订单信息 XML 数据转换为 Java 对象,便于处理。 4. **安全性和性能优化**:实现 SSL/TLS 加密通信以确保数据传输的安全性;通过缓存机制提高服务响应速度。 #### 六、总结 ...
- CXF支持JAXB(Java Architecture for XML Binding)进行对象到XML的自动转换,简化了数据交换过程。 - 也支持Aegis绑定,适用于非JAXB注解的POJO(Plain Old Java Object)。 6. **安全和认证**: - CXF支持...
压缩包中的"Conversion"文件可能包含了关于CXF转换机制的相关内容,这通常指的是CXF如何处理不同类型的数据格式,比如XML到Java对象的映射,或者JSON与POJO之间的转换。在CXF中,数据绑定组件如JAXB(Java ...
基于属性访问或注解的方式将json和POJO对象互相转换, 受JAXB基于注解的处理方式启发。通过org.codehaus.jackson.map.ObjectMapper读写json数据。它包含两种类型: 3.1 Simple Data Binding 用于json和Java Maps, ...
7. `jackson-module-jaxb-annotations-2.2.1.jar`:这是一个扩展模块,用于支持JAXB注解,使得已经用JAXB注解过的类可以无缝地与Jackson一起工作,无需额外的配置。 三、整合Spring MVC与Jackson 在Spring MVC中...
HealthProfileReader类公开了可以使用适当的参数调用的方法,这些方法使用XPATH表达式进行从XML的转换。 JAXBUnMarshaller和JAXBMarshaller类使用people包内的生成类在XML / JAva对象之间来回解析,这是由于JAXB而...
第13章 Struts和Hibernate实例——两个与登录有关的实例 166 13.1 Struts和Hibernate的开发环境配置 166 13.1.1 数据库的安装和管理 166 13.1.2 Hibernate的安装 168 13.1.3 Struts的安装 169 13.2 实例一...
XMLBeans是一种用于处理XML的Java绑定工具,JAXB则提供了将Java对象和XML数据进行互相转换的能力,而Aegis是XFire独有的数据绑定机制,它支持简单的POJO(Plain Old Java Object)到XML的映射。 2. **依赖库**: ...