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