sometimes i also doubt what XmlAdapter do.
1. format the String to anyType you want.[data]
2. split the String, and set every part to Object.[interesting]
3. retrieve the ref's datas to owner Object properties.
...
package ycl.learn.xml.jaxb.list;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
public class Employee {
@XmlJavaTypeAdapter(MapXmlAdapter.class)
@XmlElement(name="family")
public List<Family> family;
}
package ycl.learn.xml.jaxb.list;
import javax.xml.bind.annotation.XmlAttribute;
public class Family {
private String name;
private String value;
private Family family;
@XmlAttribute
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlAttribute
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Family getFamily() {
return family;
}
public void setFamily(Family family) {
this.family = family;
}
public String toString(){
return name+":"+value+"["+family+"]";
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee>
<family name="a" ></family>
<family name="b" value="ccc"></family>
<family name="c" value="cccc" extendss="a"></family>
</employee>
It is very easy function, just set extendss's family to it's family.
package ycl.learn.xml.jaxb.list;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class MapXmlAdapter extends XmlAdapter<MapXmlAdapter.AdaptedHashMap,Family> {
List<Family> families = new ArrayList<Family>();
Map<String,Family> mmfa = new HashMap<String,Family>();
@Override
public AdaptedHashMap marshal(Family v) throws Exception {
AdaptedHashMap ae = new AdaptedHashMap();
ae.setName(v.getName());
ae.setValue(v.getValue());
Family family = v.getFamily();
if(family!=null){
String extendss = family.getName();
ae.setExtendss(extendss);
}
return ae;
}
@Override
public Family unmarshal(AdaptedHashMap v) throws Exception {
String extendss = v.getExtendss();
Family mm = new Family();
mm.setName(v.getName());
mm.setValue(v.getValue());
if(extendss != null){
if(mmfa.containsKey(extendss)){
mm.setFamily(mmfa.get(extendss));
}else{
System.out.println("extendss is not exists");
}
}
mmfa.put(mm.getName(), mm);
return mm;
}
public static class AdaptedHashMap extends Family{
private String extendss;
@XmlAttribute
public String getExtendss() {
return extendss;
}
public void setExtendss(String extendss) {
this.extendss = extendss;
}
}
}
package ycl.learn.xml.jaxb.list;
import java.io.File;
import java.io.FileNotFoundException;
import javax.xml.bind.JAXBException;
import ycl.learn.xml.jaxb.JAXBUtil;
public class JAXBUtilTest {
private static final String FILE_NAME_emps = "employees.xml";
private static final String FILE_NAME_emps_copy = "employees_copy.xml";
/**
* @param args
* @throws JAXBException
* @throws FileNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException, JAXBException {
JAXBUtil<Employee> ju = new JAXBUtil<Employee>();
Employee empant = ju.unmarshal(Employee.class, new File(FILE_NAME_emps),new MapXmlAdapter());
System.out.println("reader success lll000");
System.out.println(empant.family);
ju.marshal(empant, new File(FILE_NAME_emps_copy));
}
}
package ycl.learn.xml.jaxb;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
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.adapters.XmlAdapter;
public class JAXBUtil<T> {
@SuppressWarnings("unchecked")
public T unmarshal(Class<T> clazz, InputStream is) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller un = context.createUnmarshaller();
return (T) un.unmarshal(is);
}
@SuppressWarnings("unchecked")
public T unmarshal(Class<T> clazz, InputStream is,XmlAdapter adapter) throws JAXBException {
if(adapter == null){
return unmarshal(clazz,is);
}else{
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller un = context.createUnmarshaller();
un.setAdapter(adapter);
return (T) un.unmarshal(is);
}
}
public T unmarshal(Class<T> clazz, File file) throws JAXBException, FileNotFoundException {
return unmarshal(clazz,new FileInputStream(file));
}
public T unmarshal(Class<T> clazz, File file,XmlAdapter adapter) throws JAXBException, FileNotFoundException {
return unmarshal(clazz,new FileInputStream(file),adapter);
}
public void marshal(T element,OutputStream os) throws JAXBException{
JAXBContext jc = JAXBContext.newInstance(element.getClass());
Marshaller m = jc.createMarshaller();
m.marshal(element, os);
}
public void marshal(T element,OutputStream os,XmlAdapter adapter) throws JAXBException{
if(adapter == null){
marshal(element,os);
}else{
JAXBContext jc = JAXBContext.newInstance(element.getClass());
Marshaller m = jc.createMarshaller();
m.setAdapter(adapter);
m.marshal(element, os);
}
}
public void marshal(T element, File output) throws FileNotFoundException, JAXBException{
marshal(element,new FileOutputStream(output));
}
public void marshal(T element, File output,XmlAdapter adapter) throws FileNotFoundException, JAXBException{
marshal(element,new FileOutputStream(output),adapter);
}
}
JAXBUtils is complex now, hahah, more function, more complex, this is the rule.
分享到:
相关推荐
JAXB(Java Architecture for XML Binding)是Java平台上的一个标准,它提供了一种在Java对象和XML文档之间进行映射的机制。Eclipse作为一款强大的Java集成开发环境,为开发者提供了丰富的插件支持,其中包括JAXB的...
JAXB2,全称为Java Architecture for XML Binding 2,是Java平台上的一个标准技术,用于在XML和Java对象之间进行绑定。它允许开发者通过简单的API将XML文档转换为Java对象,反之亦然,大大简化了XML数据处理。JAXB2...
**JAXB(Java Architecture for XML Binding)** 是Java平台中用于XML到Java对象绑定的API,它是Java EE和Java SE标准的一部分,允许开发者在Java应用程序中方便地将XML数据转换为Java对象,反之亦然。这个过程极大...
标题中的"jaxb-impl-2.3.0、jaxb-core-2.3.0、jaxb-api-2.3.0"是JAXB的不同组件版本号,它们在处理XML到Java对象之间的转换时起到关键作用。在描述中提到的“Maven项目中缺少jaxb-api的异常报错”,通常指的是在运行...
适配器需要扩展`XmlAdapter`并重写`marshal()`和`unmarshal()`方法。 8. **@XmlAccessorType(XmlAccessType.PROPERTY)**: 与`FIELD`相反,`PROPERTY`表示JAXB将根据getter和setter方法来绑定属性,而不是直接访问...
`jaxb-api`和`jaxb-impl`是JAXB框架的核心组成部分。这两个JAR文件在处理XML到Java对象的绑定过程中扮演着关键角色。 1. **jaxb-api.jar**: 这个库包含了JAXB API,即Java接口和抽象类,定义了JAXB的工作方式。它...
`jaxb-api-2.1.jar` 和 `jaxb-impl-2.1.8.jar` 是Java应用程序中用于XML绑定(Java Architecture for XML Binding,简称JAXB)的重要库文件。JAXB是Java SE和Java EE平台的标准部分,它提供了一种将XML文档与Java...
这些文件是Java编程环境中常用的库文件,主要用于XML绑定(Java Architecture for XML Binding,JAXB)和JavaBeans Activation Framework(JAF)。在Java应用程序开发中,尤其是处理XML数据时,这些库扮演着至关重要...
这可以通过实现`XmlAdapter`接口来完成,它允许你控制XML元素和属性如何映射到Java类型。 7. **JAXB插件**: 在开发过程中,可能会使用到各种JAXB插件来增强其功能,例如,添加代码生成插件,可以在构建过程中自动...
Java Architecture for XML Binding (JAXB) 是Java平台中用于XML到Java对象绑定的标准技术,它允许开发者在Java程序中直接操作XML数据,而无需编写大量的XML解析和序列化代码。JAXB 2.3.0是该技术的一个版本,包含了...
Java Architecture for XML Binding (JAXB) 是Java平台中用于XML数据绑定的标准库,它使得Java对象和XML文档之间可以进行无缝转换。在给定的压缩包文件中,包含了一些核心的JAXB组件以及相关的依赖库,如`jaxb-impl....
当我们需要处理XML文件,比如从XML中提取数据时,JAXB(Java Architecture for XML Binding)是一个强大的工具。本教程将详细解释如何在Idea中利用JAXB来读取XML文件中的数据。 JAXB是Java标准API,它提供了将Java...
Java Architecture for XML Binding (JAXB) 是Java平台中用于XML数据绑定的标准API,它使得Java对象和XML文档之间可以进行无缝转换。`jaxb-api-2.1.9.jar` 是一个包含JAXB API的库文件,版本为2.1.9,用于支持开发...
在Java开发中,JAXB(Java Architecture for XML Binding)是一个用于将XML文档和Java对象之间进行绑定的技术。在处理XML文件时,特别是涉及到序列化和反序列化时,可能会遇到字符编码问题,即所谓的“乱码”。这个...
标题提到的"jaxb-api.jar.jaxws-api.zip_ jaxb-api.jar_cxf_jax-ws.jar_jaxb-api",是针对这个问题提供的一组支持包。 **JAXB(Java Architecture for XML Binding)** 是Java平台的一个标准,它允许开发者将XML文...
在Android平台上进行开发时,有时候我们需要处理XML数据,这时候JAXB(Java Architecture for XML Binding)就显得非常有用。JAXB是Java SDK中的一个标准API,它允许开发者将XML文档与Java对象之间进行自动的双向...
在使用webservice,mule esb等需要jaxb的项目里经常会出现 JAXB 2.0 API is being loaded from the bootstrap classloader这个错误,按照打出的信息Use the endorsed directory mechanism to place jaxb-api.jar in ...
10. **自定义转换**:对于无法直接映射的类型,JAXB允许通过实现`XmlAdapter`接口来自定义转换逻辑。 JAXB API 2.2的jar包`jaxb-api-2.2.jar`包含了所有必要的类和接口,供开发者在项目中引用和使用。通过导入这个...
**Java Architecture for XML Binding (JAXB)** 是Java平台上的一个标准技术,用于在XML和Java对象之间进行数据绑定。它提供了方便的接口和工具,使得开发者可以轻松地将XML文档转换为Java对象,同时也可以将Java...