使用带有JAXB的通用列表包装器添加默认名称空间声明

时间:2014-04-08 11:50:28

标签: jaxb xml-namespaces

我对JAXB都很陌生,并且已经将我的大脑毁了一个星期,我想问下面这个问题。如何使用Blaise Doughan生成的通用列表包装器获取这些默认命名空间声明:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<departments xmlns="urn:example.org/departments">
 <department>
    <iddepartment>1</iddepartment>
    <department>Deparment A</department>
    <v_iddepartment>1</v_iddepartment>
 </department>
 <department>
    <iddepartment>2</iddepartment>
    <department>Department B</department>
    <v_iddepartment>1</v_iddepartment>
 </department>
</departments>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employees xmlns="urn:example.org/employees">
 <employee>
    <firstname>Tom</firstname>
    <lastname>Jones</lastname>
    <praefix>Dr.</praefix>
    <birthdate>1970-01-01</birthdate>
    <ipnumber>1234</ipnumber>
 </employee>
 <employee>
    <firstname>Elvis</firstname>
    <lastname>Knoxville</lastname>
    <praefix/>
    <birthdate>1970-01-02</birthdate>
    <ipnumber>4567</ipnumber>
 </employee>
</employees>

我有几个带注释的类:

package org.bp24.server.table;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "department", namespace = "urn:example.org/departments")
@XmlType(propOrder = {"iddepartment", "department", "v_iddepartment"})
public class Department {

private int iddepartment;

private String department;

private int v_iddepartment;

public int getIddepartment() {
    return iddepartment;
}

public void setIddepartment(int iddepartment) {
    this.iddepartment = iddepartment;
}

public String getDepartment() {
    return department;
}

public void setDepartment(String department) {
    this.department = department;
}

public int getV_iddepartment() {
    return v_iddepartment;
}

public void setV_iddepartment(int v_iddepartment) {
    this.v_iddepartment = v_iddepartment;
}

}

package org.bp24.server.table;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "employee", namespace = "urn:example.org/employees")
@XmlType(propOrder = {"firstname", "lastname", "praefix", "suffix", "birthdate", "ipnumber"})
public class Employee {

private int idemployee;

private String firstname;

private String lastname;

private String praefix;

private String suffix;

private String birthdate;

private String ipnumber;

private int v_iduser; 

@XmlTransient
public int getIdemployee() {
    return idemployee;
}

public void setIdemployee(int idemployee) {
    this.idemployee = idemployee;
}

public String getFirstname() {
    return firstname;
}

public void setFirstname(String firstname) {
    this.firstname = firstname;
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

public String getPraefix() {
    return praefix;
}

public void setPraefix(String praefix) {
    this.praefix = praefix;
}

public String getSuffix() {
    return suffix;
}

public void setSuffix(String suffix) {
    this.suffix = suffix;
}

public String getBirthdate() {
    return birthdate;
}

public void setBirthdate(String birthdate) {
    this.birthdate = birthdate;
}

public String getIpnumber() {
    return ipnumber;
}

public void setIpnumber(String ipnumber) {
    this.ipnumber = ipnumber;
}

@XmlTransient
public int getV_iduser() {
    return v_iduser;
}

public void setV_iduser(int v_iduser) {
    this.v_iduser = v_iduser;
}

}

这是我使用的列表包装器:

package org.bp24.server.xml.copy;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;

public class GenericList <T> {

private List<T> list = new ArrayList<T>();

public GenericList() {
}

public GenericList(List<T> list) {
    this.list = list;
}

public void add (T element){
    list.add(element);
}

public boolean isEmpty(){
    if(list.isEmpty()) return true;
    return false;
}

public T get (int pos){
    return list.get(pos);
}

@XmlAnyElement(lax=true)
public List<T> getList(){
    return list;
}

}

以下是编组代码:

package org.bp24.server.xml.copy;

import java.util.HashMap;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;

import org.bp24.server.xml.GenericList;

public class MarshallMatters<T> {

private static volatile HashMap<Class, JAXBContext> contextStore = new HashMap<Class, JAXBContext>();

//synchronized to ensure orderly concurrent contextStore access
private synchronized JAXBContext getContext (Class clazz) throws JAXBException{

    if(contextStore.containsKey(clazz)) return contextStore.get(clazz);
    JAXBContext context = JAXBContext.newInstance(GenericList.class, clazz);
    contextStore.put(clazz, context);
    return context;

}

private Class getClassFromList(List<T> list){

    if(!list.isEmpty()) return list.get(0).getClass();
    return null;

}

public void writeXml(List<T> list) throws JAXBException{

    Class clazz = getClassFromList(list);
    if(clazz==null){
        System.out.println("Error message");
        return;
    }
    JAXBContext jc = getContext(clazz);
    GenericList<T> genList = new GenericList<T>(list);
    Marshaller m = jc.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

    QName qn = new QName(clazz.getSimpleName().toLowerCase() + "s");
    JAXBElement<GenericList> jaxbe = new JAXBElement<GenericList>(qn, GenericList.class, genList);
    m.marshal(jaxbe, System.out);

}

public void readXml(List<T> list) throws JAXBException{

    ...

}

}

非常感谢您的帮助。

0 个答案:

没有答案