2015-04-15 64 views
0

JAXB注解类:JAXB:需要设置的命名空间动态

@XmlRootElement(name = "group") 
@XmlType(propOrder = {"name", "description", "types" }) 
public class GroupElement implements Serializable { 

private static final long serialVersionUID = 1L; 

private long id; 
private String description; 
private String name; 
private List<TypeElement> types; 

@XmlTransient 
public long getId() { 
    return id; 
} 

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

@XmlElement(name = "description") 
public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 

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

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

@XmlElement(name = "type") 
public List<TypeElement> getTypes() { 
    return types; 
} 

public void setTypes(List<TypeElement> types) { 
    this.types= types; 
} 

}

java-package.info

@XmlSchema(namespace = "http://www.test.at/r1/v1" , 
elementFormDefault = XmlNsForm.QUALIFIED, 
xmlns={@XmlNs(prefix="cdr1", namespaceURI="http://www.test.at/r1/v1")}) 

JAXB编组:

JAXBContext jaxbContext = JAXBContext.newInstance(Group.class); 
Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
jaxbMarshaller.marshal(group, sw); 

我需要动态设置命名空间的依赖克在小组上。使用package-info方法,我可以在每个XML文件中获得相同的命名空间。

我也试过

JAXBElement<Group> element = new JAXBElement<Group>(new 
QName(latestStructure.getNamespace(), "group", "cdr1"), 
Group.class, group); 

但这种方法只有根元素获得分配的命名空间和前缀。

有没有人有一个想法如何做到这一点?

回答

0

你可以从类和包中取出命名空间的信息,但创建限定名对象工厂(以便尽可能多的对象工厂为许多命名空间),

@XmlRegistry 
public class ObjectFactory { 
... 
} 

,然后使用正确的工厂启动您的上下文而不是Group类:

JAXBContext.newInstance(ObjectFactory.class); 

对我来说更容易将再次使用豆类没有命名空间,马歇尔命名空间自由XML和使用XSLT根据需要添加正确的“动态”的命名空间转换XML。

+0

命名空间也由用户动态创建并存储在数据库中。所以我不能使用对象工厂。 – p4tm4n