簡體   English   中英

從2個xsd文件中有2個XmlRootElements時進行編組/解組

[英]Marshal/unmarshal when there are 2 XmlRootElements from 2 xsd files

有人告訴我,我正在使用xsd執行Java恐怖表演,以通過JAXB生成類……希望有人可以告訴我什么!

我已經獲得了幾個相關的XSD,它們需要能夠與API交互。 假設有A.xsd和B.xsd。 A.xsd定義了一個body元素,該元素本質上可以包含任何類型的列表,包括B個對象:

<xsd:element name="Body" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:anyAttribute namespace="##any"/>
</xsd:complexType>
</xsd:element>

因此,我為A.xsd生成了類,其根元素被標記為:

@XmlRootElement(name = "A", namespace = "http://www.example.com/a")
public class A {

然后在同一個包中創建package-info.java來擁有該名稱空間,以便將其編組:

@XmlSchema(namespace = "http://www.example.com/a", elementFormDefault = XmlNsForm.QUALIFIED)
package com.mypackage;

現在,我將B.xsd的類生成到同一包中 (我將A的ObjectFactory重命名為其他名稱,因為IntelliJ不追加工廠)。

編輯 :我也在不同的程序包中創建了它們,但隨后出現編組問題,因為請求xml同時需要A和B。)

(子問題-您通常會采用這種方式嗎?)

因此,B類現在具有:

@XmlRootElement(name = "B")
public class B {

有了這個,我現在可以創建一個A並將其編組。 多虧了package-info.java (我將Java編組對象-刪除xml中多余的ns2注釋 ),將B嵌入到主體中時,我並沒有得到討厭的ns2。

我從API獲得的響應消息也給了我一個A,我可以毫無問題地將其編組。 但是 Body中的基礎對象(應該是B不會被解組-它是Node對象,所以我嘗試了:

JAXBContext specialContext = JAXBContext.newInstance(B.class);
Object companyAppt = specialContext.createUnmarshaller().unmarshal((Node)reply.getBody().getAny().get(0));

但是我得到這個異常:

javax.xml.bind.UnmarshalException: unexpected element (uri:"/some/uri/location", local:"B"). Expected elements are <{http://www.example.com/a}B>

因此,我認為答案就在那個package-info.java中,但我只是不知道如何操作它。

提前致謝。

編輯

這是我正在使用的xsd:

在我的示例中,“ A” = http://xmlgw.companieshouse.gov.uk/v1-0/schema/Egov_ch-v2-0.xsd

我的例子中的“ B” = http://xmlgw.companieshouse.gov.uk/v1-0/schema/CompanyDetails-v2-1.xsd

其他相關的xds: http ://xmlgw.companieshouse.gov.uk/v1-0/schema/chbase-v2-1.xsd

為什么不使用xjc創建Jaxb類,如果有沖突,您可以在其中傳遞多個xsds並使用綁定文件。

xjc -d out A.xsd B.xsd

暫無
暫無

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

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