Java JAX-B:从XMLAttribute动态生成元素名
我正在使用JAX-B(v.2.2.12)封送java对象树。 要封送的类之一是CaseObject:Java JAX-B:从XMLAttribute动态生成元素名,java,xml,jaxb,Java,Xml,Jaxb,我正在使用JAX-B(v.2.2.12)封送java对象树。 要封送的类之一是CaseObject: public class CaseObject { ... @XmlAnyElement @XmlJavaTypeAdapter(ParameterAdapter.class) protected List <CaseObject> caseObjects; ... } 公共类CaseObject{ ... @XmlAnyElement @XmlJavaTypeAdap
public class CaseObject {
...
@XmlAnyElement
@XmlJavaTypeAdapter(ParameterAdapter.class)
protected List <CaseObject> caseObjects;
...
}
公共类CaseObject{
...
@XmlAnyElement
@XmlJavaTypeAdapter(ParameterAdapter.class)
受保护的物品清单;
...
}
编组后的当前xml表示:
<caseObject id="1" name="someName" typeId="0">
...
<caseObject id="29" key="someOtherName" typeId="12">
...
</caseObject>
</caseObject>
...
...
所需的目标xml表示:
<someName id="1" name="someName" typeId="0">
...
<someOtherNameid="29" key="someOtherName" typeId="12">
...
</someOtherName>
</someName>
...
...
我使用以下代码段()扩展了它:
@覆盖
公共元素封送处理(CaseObject)引发异常{
if(null==caseObject){
返回null;
}
//1.构建一个JAXBElement
QName rootElement=新的QName(caseObject.getName());
对象值=案例对象;
类类型=value.getClass();
JAXBElement=newjaxbelement(根元素、类型、值);
//2.将JAXbeElement封送到DOM元素。
Document Document=getDocumentBuilder().newDocument();
Marshaller Marshaller=getJAXBContext(type).createMarshaller();
//蛇咬自己尾巴的地方。。。
marshaller.marshall(jaxbElement,文档);
Element=document.getDocumentElement();
返回元素;
}
问题是:如何在编组过程中为JAX-B提供工具,以便从属性(XMLAttribute)动态生成元素名称 以下XMLAdapter对我有效。只需选择JAXBElement作为适配器的ValueType。(当然,将您的具体对象用作BoundType。)此解决方案的前提是,QName的值是有效的xml元素名
public class CaseObjectAdapter extends XmlAdapter<JAXBElement, CaseObject> {
@Override
public JAXBElement marshal(CaseObject caseObject) throws Exception {
JAXBElement<CaseObject> jaxbElement = new JAXBElement(new QName(caseObject.methodThatReturnsAnElementName()), caseObject.getClass(), caseObject);
return jaxbElement;
}
...
公共类CaseObjectAdapter扩展了XmlAdapter{
@凌驾
公共JAXbeElement封送处理(CaseObject CaseObject)引发异常{
JAXBElement-JAXBElement=new-JAXBElement(新的QName(caseObject.methodThatReturnsAnElementName()),caseObject.getClass(),caseObject);
回归方程;
}
...
为了完整起见,应该提到使用XMLAdapters时的一个潜在缺点:当从使用XMLAdapters注释的类生成XSD时,目前没有自动将更改类似于XSD的选项。
public class CaseObjectAdapter extends XmlAdapter<JAXBElement, CaseObject> {
@Override
public JAXBElement marshal(CaseObject caseObject) throws Exception {
JAXBElement<CaseObject> jaxbElement = new JAXBElement(new QName(caseObject.methodThatReturnsAnElementName()), caseObject.getClass(), caseObject);
return jaxbElement;
}
...