簡體   English   中英

JAXB和編組

[英]JAXB and marshalling

我有以下內容:

JAXBContext context = JAXBContext.newInstance(A.class, B.class, C.class, D.class);

假設A,B,C,D是來自具有不同名稱空間的不同架構的類。

我正在創建Marshaller對象,如下所示:

Marshaller m = context.createMarshaller();

然后,我使用此Marshaller m將A的實例轉換為XML。

生成XML代碼時,Marshaller對象還將放置與B,C和D關聯的其他命名空間。

我看到以下內容:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns4:A 
xmlns:ns4="http://a.com/" 
xmlns:ns5="http://b.com/"
xmlns:ns6="http://c.com/"
xmlns:ns7="http://d.com/">
<ns4:Foo></ns4:Foo>
</ns4:A>

我不想將ns5,ns6和ns7添加到XML中。 我該怎么做?

提前致謝!

使用package-info.java將名稱空間綁定到包中的類,whilch將如下所示:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://nameSpaceUri"
, xmlns = {
    @XmlNs(prefix = "myPrefix", namespaceURI = "http://nameSpaceUri")
}
, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

package my.package.;

如果沒有名稱空間應用於編組對象,則此

<ns4:A 
xmlns:ns4="http://a.com/" 
xmlns:ns5="http://b.com/"
xmlns:ns6="http://c.com/"
xmlns:ns7="http://d.com/">

將會發生。

注意:我是EclipseLink JAXB(MOXy)的負責人,並且是JAXB(JSR-222)專家組的成員。

您所看到的行為將根據您使用的JAXB實現而有所不同。 MOXy實現將為您提供所需的結果。 我將在下面展示。

Java模型

下面是將用於此示例的Java模型。 包級別@XmlSchema批注將用於在每個包中指定名稱空間資格(請參閱: http ://blog.bdoughan.com/2010/08/jaxb-namespaces.html)。

論壇13408684.aA

package forum13408684.a;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class A {

}

forum13408684.a.package-info

@XmlSchema(namespace="A", elementFormDefault=XmlNsForm.QUALIFIED)
package forum13408684.a;

import javax.xml.bind.annotation.*;

forum13408684.bB

package forum13408684.a;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class B {

}

forum13408684.b.package-info

@XmlSchema(namespace="B", elementFormDefault=XmlNsForm.QUALIFIED)
package forum13408684.b;

import javax.xml.bind.annotation.*;

演示代碼

package forum13408684;

import javax.xml.bind.*;
import forum13408684.a.A;
import forum13408684.b.B;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(A.class, B.class);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(new A(), System.out);
        marshaller.marshal(new B(), System.out);
    }

}

輸出值

JAXB參考實現

以下輸出與您在問題中描述的內容匹配:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a xmlns="A" xmlns:ns2="B"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:b xmlns="A" xmlns:ns2="B"/>

EclipseLink JAXB(MOXy)

如果將MOXy指定為JAXB提供程序(請參閱: http ://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html),您將獲得所需的輸出。

<?xml version="1.0" encoding="UTF-8"?>
<a xmlns="A"/>
<?xml version="1.0" encoding="UTF-8"?>
<ns0:b xmlns:ns0="B"/>

暫無
暫無

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

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