`

JAXB(二)Map属性映射

 
阅读更多

 

//JAXB support Collection(List,Set),does not support Map(not Collection).

//XmlAdapter<ValueType,BoundType> : !use List to implement Map's feature,like (List students)!!!

//<ValueType> : to be persisted format, The type that JAXB knows how to handle out of the box

//<BoundType> : memory format, The type that JAXB doesn't know how to handle

public class MapAdapter extends XmlAdapter<MapAdapter.AdaptedMap, Map<String, String>>

 

 

/**
 * @author timeriver.wang
 * @date 2013-01-09 8:07:01 PM
 */
@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Student {
	private String id;
	private String name;
	public String getId() {
		return id;
	}
	@XmlElement(name = "id")
	public void setId(String id) {
		this.id = id;
	}
	@XmlElement(name = "name")
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 

/**
 * @author timeriver.wang
 * @date 2013-01-09 8:08:15 PM
 */
public class Test {
    private static String filePath = "D:/teacher.xml";
    public static void main( String[] args )throws Exception {
        toXml();
        toObj();
    }

    private static void toXml()throws Exception {
        Teacher teacher = initTeacher();
        //
        JAXBContext jaxbContext = JAXBContext.newInstance( Teacher.class );
        // marshal 整理,编列,元帅的意思
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        // format, make every element keep a separate line. 
        jaxbMarshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );

        //output --> file
        File file = new File( filePath );
        jaxbMarshaller.marshal( teacher, file );
        //output --> console
        jaxbMarshaller.marshal( teacher, System.out );
    }
    
    private static void toObj()throws Exception {
        File file = new File( filePath );
        JAXBContext jaxbContext = JAXBContext.newInstance( Teacher.class );
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        Teacher teacher = (Teacher) jaxbUnmarshaller.unmarshal( file );
        System.out.println( teacher.getName() );
    }
    
    private static Teacher initTeacher(){
     // organize Object(to be saved/persisted)
        Teacher teacher = new Teacher();
        teacher.setId( "101" );
        teacher.setName( "DAO SHI" );
        Address address = new Address();
        address.setArea( "bei jing, hai dian qu" );
        address.setStreet( "shang di 8 jie 88 hao" );
        teacher.setAddress( address );
        Student stu1 = new Student();
        stu1.setId( "007" );
        stu1.setName( "ZHOU XING XING" );
        Student stu2 = new Student();
        stu2.setId( "008" );
        stu2.setName( "DA WEN XI" );
        List<Student>students = new ArrayList<Student>();
        students.add( stu1 );
        students.add( stu2 );
        teacher.setStudents( students );
        Set<String> interests = new HashSet<String>();
        interests.add( "play dota" );
        interests.add( "smoke" );
        teacher.setInterests( interests );
        Map<String,String> phones = new HashMap<String,String>();
        phones.put( "workPhoe", "18612345678" );
        phones.put( "homePhoe", "01012345678" );
        teacher.setPhones( phones );
        return teacher;
    }

}

 

/**
 * @author timeriver.wang
 * @date 2013-01-09 8:07:09 PM
 */
// @XmlRootElement(namespace ="NAMESPACE" )
@XmlRootElement
@XmlType(propOrder = {"id","name","address","students","interests","phones"})
public class Teacher {
    private String id;

    private String name;
    
    private Address address;

    private List<Student> students;

    private Set<String> interests;

    private Map<String, String> phones;

    @XmlAttribute(name = "tid")
    public String getId() {
        return id;
    }

    public void setId( String id ) {
        this.id = id;
    }

    @XmlElement(name = "tname")
    public String getName() {
        return name;
    }

    public void setName( String name ) {
        this.name = name;
    }

    @XmlElement(name = "address")
    public Address getAddress() {
        return address;
    }

    public void setAddress( Address address ) {
        this.address = address;
    }

    @XmlElementWrapper(name = "students")
    @XmlElement(name = "student")
    public List<Student> getStudents() {
        return students;
    }

    public void setStudents( List<Student> students ) {
        this.students = students;
    }

    @XmlElementWrapper(name = "interests")
    @XmlElement(name = "interest")
    public Set<String> getInterests() {
        return interests;
    }

    public void setInterests( Set<String> interests ) {
        this.interests = interests;
    }

//    can not use XmlElementWrapper, because "Map" is not a "Collection"
//    @XmlElementWrapper(name = "phones")
//    @XmlElement(name = "phone")
    
//  也可以不加任何注解,JAXB,会提供一个默认的注解
    @XmlJavaTypeAdapter(MapAdapter.class)
    @XmlElement(name = "phones")
    public Map<String, String> getPhones() {
        return phones;
    }

    public void setPhones( Map<String, String> phones ) {
        this.phones = phones;
    }

}

 

//JAXB support Collection(List,Set),does not support Map(not Collection).
//XmlAdapter<ValueType,BoundType> : !use List to implement Map's feature,like (List students)!!!
//<ValueType> : to be persisted format, The type that JAXB knows how to handle out of the box
//<BoundType> : memory format, The type that JAXB doesn't know how to handle
public class MapAdapter extends XmlAdapter<MapAdapter.AdaptedMap, Map<String, String>> {
     
    public static class AdaptedMap {
         
        public List<Entry> entry = new ArrayList<Entry>();
  
    }
     
    public static class Entry {
         
        public String key;
         
        public String value;
   
    }
 
    @Override
    public Map<String, String> unmarshal(AdaptedMap adaptedMap) throws Exception {
        Map<String, String> map = new HashMap<String, String>();
        for(Entry entry : adaptedMap.entry) {
            map.put(entry.key, entry.value);
        }
        return map;
    }
 
    //use List to implement Map's feature,like (List students)!
    @Override
    public AdaptedMap marshal(Map<String, String> map) throws Exception {
        AdaptedMap adaptedMap = new AdaptedMap();
        for(Map.Entry<String, String> mapEntry : map.entrySet()) {
            Entry entry = new Entry();
            entry.key = mapEntry.getKey();
            entry.value = mapEntry.getValue();
            adaptedMap.entry.add(entry);
        }
        return adaptedMap;
    }
 
}

 

@XmlRootElement
public class Address {
    private String area;
    
    private String street;
 
    @XmlElement(name = "area")
    public String getArea() {
        return area;
    }

    public void setArea( String area ) {
        this.area = area;
    }

    @XmlElement(name = "street")
    public String getStreet() {
        return street;
    }
 
    public void setStreet(String street) {
        this.street = street;
    }
 
}

 

分享到:
评论

相关推荐

    jaxb xml 转map

    如果有属性,可以将属性名和属性值作为二级Map添加到主Map中。 5. 处理嵌套节点:如果XML中有嵌套节点,可以递归地将它们转换为嵌套的Map结构。 6. 完成转换:遍历结束后,Map就包含了整个XML文档的数据结构。 在...

    JAXB-XML注解

    @XmlAttribute 注解用于将 Java 对象的属性映射为 XML 属性。它可以通过 name 属性为生成的 XML 属性指定别名。 例如: ```java @XmlAttribute(name = "Country") private String state; ``` 五、@XmlAccessorType ...

    jaxb和jackson的jar

    JAXB的核心概念包括:`@XmlRootElement`、`@XmlElement`、`@XmlAttribute`等注解,这些注解用于标记Java类和类的字段,以便JAXB知道如何映射它们到XML元素和属性。 **Jackson简介** Jackson是另一个流行的数据绑定...

    Java xml转化为map

    如果一个元素有多个属性,这些属性将以某种形式(例如属性对象或属性Map)存储。如果元素有子元素,子元素将成为嵌套的Map或者List。 要实现XML到Map的转换,我们可以使用Java的标准库JAXB(Java Architecture for ...

    java一键xml转map,一键map转xml工具类

    在Java编程中,XML(可扩展标记语言)和Map(映射)是两种常见的数据存储和交换格式。XML因其结构化和易于解析的特性,在数据交换和配置文件中广泛使用,而Map则作为Java中存储键值对的高效数据结构。在实际开发中,...

    使用jaxb读取配置文件,并使用POI修改excel内容的例子

    通过JAXB,你可以将XML文档的数据映射到Java对象,反之亦然。这使得处理XML配置文件变得简单且直观。在描述的项目场景中,PTN(Packet Transport Network)健康检查报告的配置可能存储在XML文件中,使用JAXB可以方便...

    cxf-webservice复杂类型

    例如,Map对象不能直接映射到XML元素,因为XML Schema不支持动态属性的直接表示。 2. **自定义数据类型**:对于像Map这样的复杂类型,开发者可以创建自定义的数据类型来映射XML元素。这通常涉及到创建一个Java类,...

    map/list集合转化成xml字符串 xml字符串转化成map/list集合

    以`JAXB`为例,它提供了一种方便的方式来映射Java对象到XML以及反之。首先,你需要创建一个`JAXBContext`实例,然后使用`Marshaller`对象将`Map`对象写入XML字符串。 ```java import javax.xml.bind.JAXBContext; ...

    Java xml 转 map

    这个过程通常涉及到XML解析和数据映射。 在描述中提到的“递归 XML 转 MAP”,是指XML文档可能存在嵌套结构,递归方法是处理这种结构的有效手段。递归意味着函数调用自身来处理XML元素的子节点,直到所有节点都被...

    dozer-user-guide

    - Map-backed属性映射:处理Map类型数据的映射。 - 索引映射:根据索引关系进行映射。 - 深层映射:递归映射对象中的所有属性。 - 排除字段:在映射过程中排除某些不需要映射的字段。 - 单向映射:只进行单向映射,...

    07.处理Map等CXF无法自动转换的复合数据类型的形参和返回值

    对于Map,我们可以通过创建一个自定义的JAXB类,将Map元素映射到XML节点,然后在服务端和客户端之间传递这个自定义类。 接下来,我们可以通过以下步骤实现这个过程: 1. **创建JAXB类**:为Map创建一个对应的JAXB...

    Xsd2Map:使用 xsd 作为架构读取 json 或 xml 负载并将其转换为映射

    这个过程可能包括验证数据的有效性、解析元素和属性、以及将这些元素映射到Java对象的属性上。转换为映射后,数据可以更方便地被Java代码访问,例如,通过键来查找和修改值。 Xsd2Map的实现可能依赖于Java的标准库...

    dozer(PDF)

    - **映射Map支持的属性**:针对Map类型的属性,可以指定如何映射键值对。 - **索引映射**:如果需要按照特定顺序映射数组或列表,可以使用索引映射。 - **深度映射**:当源对象和目标对象具有相同的嵌套结构时,可以...

    各种转换,xml,实体bean,动态bean,map等

    在Java中,我们可以使用JAXB(Java Architecture for XML Binding)进行XML与Java对象之间的双向绑定,或者使用DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)等API来...

    Java解析和生成XML.pdf

    当使用JAXB进行操作时,对于类的属性访问控制需要特别注意,例如,如果私有属性设置了public权限的getter/setter方法,则不应使用`@XmlElement`和`@XmlAttribute`注解,否则可能会因为同一个属性在Java类中被映射两...

    a road map through nachos

    #### 二、Nachos Machine(Nachos机器) 这一部分主要介绍了构成Nachos运行环境的基础硬件组件及其管理机制。 ##### 2.1 Machine Components(机器组件) - **CPU**: Nachos基于MIPS架构设计,该架构的特点是简单...

    java转换xml、list、map和json.pdf

    - `maptoXml()`方法遍历Map的键值对,创建一个`key`元素并设置其属性和文本。 2. **Map到XML转换**: - `doc2String()`方法(未在代码中显示)应该是将`Document`对象转换为字符串的方法,通常会使用`...

    java解释Xml,从数据库中读出来,解释Xml

    - **JAXB(Java Architecture for XML Binding)**:自动将XML映射到Java对象,反之亦然。对于复杂的XML结构,JAXB提供了一种便捷的转换方式。 - **DOM4J**和**JDOM**:这两个是第三方库,提供了对DOM的扩展,简化...

    xml操作之betwixt实例

    通过定义绑定,我们可以指定如何将类的属性映射到XML结构。 以下是一个简单的Java类示例,我们将其映射到XML: ```java public class Person { private String name; private int age; // getters and ...

Global site tag (gtag.js) - Google Analytics