0

私は次のものを持っています:

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 に追加したくありません。どうすればいいのですか?

前もって感謝します!

4

2 に答える 2

0

注: 私は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.*;

フォーラム13408684.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)

JAXBプロバイダーとしてMOXyを指定すると(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"/>
于 2012-11-16T11:58:46.607 に答える
0

名前空間をパッケージ内のクラスにバインドします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/">

起こります。

于 2012-11-16T01:59:52.757 に答える