簡體   English   中英

JAXB:需要動態設置名稱空間

[英]JAXB: need to set namespace dynamically

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);

但是使用這種方法,只有根元素才能獲得命名空間和前綴分配。

有誰知道如何做到這一點?

您可以從類和包中刪除名稱空間信息,但可以使用限定名稱創建對象工廠(因此,對象工廠與名稱空間一樣多),

@XmlRegistry
public class ObjectFactory {
...
}

然后使用正確的工廠而不是Group類來初始化上下文:

JAXBContext.newInstance(ObjectFactory.class);

對我而言,更簡單的方法是再次使用不帶名稱空間的bean,將其編組為自由名稱空間的xml,並使用xslt轉換xml以根據需要添加正確的“動態”名稱空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM