簡體   English   中英

JAXB 生成意外的標簽名稱,返回類型名稱

[英]JAXB Generating unexpected tag name, returns type name

我遇到的問題是我正在生成的 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 類型的 object

@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 類型的 object 創建 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();
}

暫無
暫無

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

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