[英]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.