9

現在、次のコードを使用してオブジェクトを xml 文字列にマーシャリングしています

    JAXBContext context;

    try {
        context = JAXBContext.newInstance(heartbeat.getClass());
        StringWriter writer = new StringWriter();
        Marshaller marshaller = context.createMarshaller();

        heartbeat.setHeader(header);
        heartbeat.setHeartbeatEvent(event);

        marshaller.marshal(heartbeat, writer);
        String stringXML = writer.toString();
        return stringXML;

    } catch (JAXBException e) {
        throw new RuntimeException("Problems generating XML in specified "
                + "encoding, underlying problem is " + e.getMessage(),
                e);
    }

次のヘッダーを生成します

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

私の望ましい出力は次のとおりです

<?xml version=\"1.0\"?>

これをマーシャラーに追加することで

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);
marshaller.setProperty("com.sun.xml.bind.xmlHeaders", "<?xml version=\"1.0\"?>");

私は受け取ります

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><?xml version="1.0"?>

JAXB_FRAGMENT プロパティを TRUE に変更すると、ヘッダーが完全に削除されます。問題を解決しようとしてJAXB - Remove 'standalone="yes"' from generated XML threadに従っていますが、これまでのところ運がありません。JAXBマーシャラーから目的のヘッダーを取得する方法について、誰かが私に洞察を与えることができますか?

4

3 に答える 3

24

OutputStream次の組み合わせを使用してにマーシャリングすると、期待される出力が生成されます。

    marshaller.setProperty("com.sun.xml.bind.xmlHeaders", "<?xml version=\"1.0\"?>");
    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

表示されている問題は、にマーシャリングするときに発生しますWriter。これは、JAXB リファレンス実装のバグのようです。以下のリンクで問題を提起できます。


あなたはいつでもできる:

JAXBContext context;

try {
    context = JAXBContext.newInstance(heartbeat.getClass());
    StringWriter writer = new StringWriter();
    writer.append("<?xml version=\"1.0\"?>");
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

    heartbeat.setHeader(header);
    heartbeat.setHeartbeatEvent(event);

    marshaller.marshal(heartbeat, writer);
    String stringXML = writer.toString();
    return stringXML;

} catch (JAXBException e) {
    throw new RuntimeException("Problems generating XML in specified "
            + "encoding, underlying problem is " + e.getMessage(),
            e);
}

EclipseLink JAXB (MOXy)も をサポートして(私は MOXy リーダーです)com.sun.xml.bind.xmlHeadersにマーシャリングするときに正しく動作しWriter

于 2013-08-26T19:56:36.257 に答える
7

これは私のために働いた

marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

于 2015-10-01T16:32:48.160 に答える
1

JAXB 3.0.1 では、上記の定数によって PropertyException が発生します。

 jakarta.xml.bind.PropertyException: name: com.sun.xml.bind.xmlDeclaration value: false

この場合、XML プリアンブルは次のマーシャラー定数で構成できます。

marshaller.setProperty("org.glassfish.jaxb.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
于 2022-01-17T15:19:19.143 に答える