JAXB生成意外的标记名称,返回类型名称



我遇到的问题是,我生成的XML与我期望的不匹配。

我有以下XSD。。。

<xs:element name="DOSLog" type="DOSLogType"/>
<xs:complexType name="DOSLogType">
<xs:sequence>
<xs:element name="Transaction" type="DOSLogTransaction"/>
</xs:sequence>
</xs:complexType>

当我从这些JAXB对象生成XML时,我会得到以下XML。。。

<DOSLogType>
<Transaction/>
</DOSLogType>

我没想到输出的标签是<DOSLogType>,而是<DOSLog>。

代码正在返回DOSLogType.java 类型的对象

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
name = "DOSLogType",
propOrder = {"transaction"}
)
@XmlRootElement(
name = "DOSLogType"
)
public class DOSLogType implements Cloneable, CopyTo, Equals, HashCode, ToString {

我希望可以使用bindings.xjc控制生成的Object和XML标记名但这似乎并不奏效。

<jaxb:bindings scd="~arts:DOSLogType"><jaxb:class ref="org.doslog.bean.DOSLogType" /></jaxb:bindings>

有人能建议我如何控制生成的XML吗?

====================================

对此有两种解决方案,XSD方法如下所示。第二个是在bindings.xjc 中修复它

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
xmlns:annox="http://annox.dev.java.net"
jaxb:extensionBindingPrefixes="inheritance annox"
jaxb:version="2.1">
<jaxb:bindings schemaLocation="DOSLog.xsd" node="/xs:schema">
<jaxb:bindings node="xs:complexType[@name='DOSLogType']">
<annox:annotate>
<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="DOSLog"/>
</annox:annotate>
</jaxb:bindings>

您可以在xsd本身中使用内联绑定

<xs:element name="DOSLog" type="DOSLogType"/>
<xs:complexType name="DOSLogType">
<xs:annotation>
<xs:documentation>Some DOSLog type documentatioms.</xs:documentation>
<xs:appinfo>
<annox:annotate>
<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="DOSLog"/>
</annox:annotate>
<jaxb:class name="DOSLogType"/>
</xs:appinfo>
</xs:annotation>
<xs:sequence>
<xs:element name="Transaction" type="DOSLogTransaction"/>
</xs:sequence>
</xs:complexType>

您可以在使用marshaller生成XML字符串时设置根元素名称
为此,请为DOCLogType类型的对象创建JAXBElement
类似的内容:

protected Marshaller marshaller;
protected <T> String marshal(T xmlBean, Class<T> clazz, String rootElementNamespace, String rootElementName) {
StringWriter stringWriter = new StringWriter();
try {
JAXBElement<T> jaxbElement = new JAXBElement<T>(new QName(rootElementNamespace, rootElementName), clazz,
xmlBean);
marshaller.marshal(jaxbElement, stringWriter);
} catch (Exception e) {
log.error(e);
throw new RuntimeException(e);
}
return stringWriter.toString();
}

最新更新