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

使用JAXB的通用列表包装器添加默认命名空间声明,jaxb,xml-namespaces,Jaxb,Xml Namespaces,我是JAXB的新手,已经为此伤了一个星期的脑筋,我想问以下问题。如何使用Blaise Doughan indroduced介绍的通用列表包装器获得如下默认名称空间声明: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <departments xmlns="urn:example.org/departments"> <department> <iddepartment>1&l

我是JAXB的新手,已经为此伤了一个星期的脑筋,我想问以下问题。如何使用Blaise Doughan indroduced介绍的通用列表包装器获得如下默认名称空间声明:

<?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.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{

    ...

}

}
事先非常感谢您的帮助

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{

    ...

}

}