`

JAXBのReference with XmlAdapter

    博客分类:
  • JAXB
 
阅读更多
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的 eclipse插件

    JAXB(Java Architecture for XML Binding)是Java平台上的一个标准,它提供了一种在Java对象和XML文档之间进行映射的机制。Eclipse作为一款强大的Java集成开发环境,为开发者提供了丰富的插件支持,其中包括JAXB的...

    JAXB2 jaxb-api.jar jaxb-xjc.jar jaxb-impl.jar activation.jar

    JAXB2,全称为Java Architecture for XML Binding 2,是Java平台上的一个标准技术,用于在XML和Java对象之间进行绑定。它允许开发者通过简单的API将XML文档转换为Java对象,反之亦然,大大简化了XML数据处理。JAXB2...

    JAXB的安装包及插件

    **JAXB(Java Architecture for XML Binding)** 是Java平台中用于XML到Java对象绑定的API,它是Java EE和Java SE标准的一部分,允许开发者在Java应用程序中方便地将XML数据转换为Java对象,反之亦然。这个过程极大...

    javax.rar(jaxb-impl-2.3.0、jaxb-core-2.3.0、jaxb-api-2.3.0)

    标题中的"jaxb-impl-2.3.0、jaxb-core-2.3.0、jaxb-api-2.3.0"是JAXB的不同组件版本号,它们在处理XML到Java对象之间的转换时起到关键作用。在描述中提到的“Maven项目中缺少jaxb-api的异常报错”,通常指的是在运行...

    jaxb生成XML例子

    适配器需要扩展`XmlAdapter`并重写`marshal()`和`unmarshal()`方法。 8. **@XmlAccessorType(XmlAccessType.PROPERTY)**: 与`FIELD`相反,`PROPERTY`表示JAXB将根据getter和setter方法来绑定属性,而不是直接访问...

    jaxb-api jaxb-impl jar

    `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

    `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...

    activation.jar jaxb1-impl.jar jaxb-api.jar jaxb-impl.jar jaxb-xjc.jar jsr173_1.0

    这些文件是Java编程环境中常用的库文件,主要用于XML绑定(Java Architecture for XML Binding,JAXB)和JavaBeans Activation Framework(JAF)。在Java应用程序开发中,尤其是处理XML数据时,这些库扮演着至关重要...

    最新JAXB解析XML教程

    这可以通过实现`XmlAdapter`接口来完成,它允许你控制XML元素和属性如何映射到Java类型。 7. **JAXB插件**: 在开发过程中,可能会使用到各种JAXB插件来增强其功能,例如,添加代码生成插件,可以在构建过程中自动...

    jaxb2.3.0依赖jar.rar

    Java Architecture for XML Binding (JAXB) 是Java平台中用于XML到Java对象绑定的标准技术,它允许开发者在Java程序中直接操作XML数据,而无需编写大量的XML解析和序列化代码。JAXB 2.3.0是该技术的一个版本,包含了...

    jaxb-impl.jar jaxb-api.jar jsr173_1.0_api.jar

    Java Architecture for XML Binding (JAXB) 是Java平台中用于XML数据绑定的标准库,它使得Java对象和XML文档之间可以进行无缝转换。在给定的压缩包文件中,包含了一些核心的JAXB组件以及相关的依赖库,如`jaxb-impl....

    idea 中用jaxb 读xml中数据

    当我们需要处理XML文件,比如从XML中提取数据时,JAXB(Java Architecture for XML Binding)是一个强大的工具。本教程将详细解释如何在Idea中利用JAXB来读取XML文件中的数据。 JAXB是Java标准API,它提供了将Java...

    jaxb api jar

    Java Architecture for XML Binding (JAXB) 是Java平台中用于XML数据绑定的标准API,它使得Java对象和XML文档之间可以进行无缝转换。`jaxb-api-2.1.9.jar` 是一个包含JAXB API的库文件,版本为2.1.9,用于支持开发...

    JAXB乱码问题解决

    在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-api.jar.jaxws-api.zip_ jaxb-api.jar_cxf_jax-ws.jar_jaxb-api",是针对这个问题提供的一组支持包。 **JAXB(Java Architecture for XML Binding)** 是Java平台的一个标准,它允许开发者将XML文...

    android上使用 jaxb所需要的包

    在Android平台上进行开发时,有时候我们需要处理XML数据,这时候JAXB(Java Architecture for XML Binding)就显得非常有用。JAXB是Java SDK中的一个标准API,它允许开发者将XML文档与Java对象之间进行自动的双向...

    jaxb-api-2.2 jaxb-impl

    在使用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 ...

    jaxb api 2.2

    10. **自定义转换**:对于无法直接映射的类型,JAXB允许通过实现`XmlAdapter`接口来自定义转换逻辑。 JAXB API 2.2的jar包`jaxb-api-2.2.jar`包含了所有必要的类和接口,供开发者在项目中引用和使用。通过导入这个...

    jaxb-ri-2.2.7

    **Java Architecture for XML Binding (JAXB)** 是Java平台上的一个标准技术,用于在XML和Java对象之间进行数据绑定。它提供了方便的接口和工具,使得开发者可以轻松地将XML文档转换为Java对象,同时也可以将Java...

Global site tag (gtag.js) - Google Analytics