6

現在、次のコードを使用してJAXBオブジェクトを出力ストリームにマーシャリングしています

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
ByteArrayOutputStream out = new ByteArrayOutputStream();
marshaller.marshal(new JAXBElement(new QName("hard_coded_namespace", clazz.getSimpleName()), clazz, obj), out);

「hard_coded_namespace」をJAXB「obj」(またはその属性の1つ、現在は同じNSを共有する必要があります)に含まれる名前空間に置き換えたいと思います。

マーシャリングの前にNS情報を取得する方法について何かアイデアはありますか?出力ストリームに、名前空間が表示されます。したがって、それらは「obj」のどこかにあります。

[更新]以下の回答で指摘されているように、JAXB_FRAGMENTプロパティを設定する必要はありません。私はそれを次のように変更しました:

    JAXB.marshal(new JAXBElement<T>(new QName("hard_coded_namespace", rootName), clazz, jaxbObject), out);
4

5 に答える 5

4

今のところ、これは私が見つけた解決策です:

    String nsURI = "";
    for(Annotation annotation: jaxbObject.getClass().getPackage().getAnnotations()){
        if(annotation.annotationType() == XmlSchema.class){
            nsURI = ((XmlSchema)annotation).namespace();
            break;
        }
    }

よりエレガントなソリューションを歓迎します:-)

于 2012-06-11T14:36:33.813 に答える
1

プロパティの使用は、Marshaller.JAXB_FRAGMENT非ルート要素の処理とはまったく関係ありません。これは、特定のマーシャリング イベントを調整する必要があるかどうかを判断するフラグとして機能します。たとえば、プロパティが設定されている場合、ドキュメントの開始イベントと終了イベントは生成されません。

以下はテストしていませんがQName、特定の JAXB オブジェクトを見つけるためのユーティリティ コードを作成する方法の基本的な考え方は次のとおりです。

  • JAXBIntrospector.isElementtrue を返す 場合は、 を使用しますJAXBIntrospector.getElementName
  • リフレクションを使用してObjectFactory、JAXB オブジェクトと同じパッケージ内のクラスで、JAXB オブジェクトとJAXBElement同じクラスのインスタンスである単一の引数を返し、受け取るメソッドを見つけます。そのメソッドを呼び出してから、 を使用しますJAXBElement.getName
于 2012-06-11T14:17:03.310 に答える
1

そのマーシャル API を使用する必要がありますか? より単純なオーバーロードがあります。obj のランタイム クラスに注釈 @XmlRootElement がある限り、単純に呼び出すことができるはずです。

marshaller.marshal(obj, out);
于 2012-06-10T01:03:29.900 に答える
0
JAXBContext jaxbCtx = JAXBContext.newInstance(Instance.class);
QName qname = jaxbCtx.createJAXBIntrospector().getElementName(instance);
于 2015-05-13T17:13:47.957 に答える