Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAX-B:从XMLAttribute动态生成元素名_Java_Xml_Jaxb - Fatal编程技术网

Java JAX-B:从XMLAttribute动态生成元素名

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

我正在使用JAX-B(v.2.2.12)封送java对象树。 要封送的类之一是CaseObject:

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

...