生成されたXMLから 'standalone =“ yes”'を削除します


82

結果のXMLでstandalone = "yes"が生成されないようにするJAXB設定を知っていますか?

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

7
なぜそれが問題なのですか?
kornel

TibcoのとWebMethod属性に慣れるのにという私のプロジェクトで@Kornelスタンドアロンは= yesが認識されないため、そのエラーを生成します
aswzen

回答:


62

このプロパティ:

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);

...次のものを持たないように使用できます:

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

ただし、このベストプラクティスは考慮しません。


2
おかげで、これはまさに私が必要としていたものです。この行を含めることがベストプラクティスであることに同意しますが、私がインターフェイスしているWebサービスはそれを期待していません。
jgrowl 2010年

6
それが機能するのは良いことですが、FWIW、正当なxmlを受け入れることができない場合、サービスは壊れているので、それに対してバグレポートを提出するのはおそらく良いことです。
StaxMan 2011年

4
JDK1.6のJAXBでは機能しません。正しい解決策については、so_mvの回答を参照してください。
sversch 2012

1
それは飛行中に爆発します:例外。
Nicolas Barbulesco 2013

1
@sversch:プロパティクラスを試すことができます: "com.sun.xml.internal.bind.xmlHeaders"
baybora.oren 2013

120

JDK1.6の一部であるJAXBで

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

13
これは期待される結果を与えません。これにより、すべてのXML宣言行が削除されます。私が欲しいのはstandalone、XML宣言の属性を削除することです。
ニコラスバルブレスコ2013

私と同じように、なぜこれが機能しないのか疑問に思われる場合、答えは、使用しているマーシャルAPIによって効果が異なるということです。marshal(Object、Outputstream)およびmarshal(Object、Writer)の場合、これはここで提案されているように機能します。marshal(Object、Node)の場合、効果はありません。残りのマーシャルAPIへの影響を探していここではサポートされているプロパティ]セクションの下に。
ラッセサムソン

60

あなたはどちらかを使うことができます

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

または

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false)

デフォルトのXML宣言を無効にしてから、カスタムXML宣言を追加するには、

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

沿って

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

生成されたxmlに変換するため、standalone = "yes"プロパティが回避されます。


2
「xmlDeclaration」を含む「setProperty」は飛行中に爆発します:例外。
Nicolas Barbulesco 2013

2
「xmlHeaders」を含む「setProperty」行も失敗します。PropertyException。したがって、これは解決策ではありません。
Nicolas Barbulesco 2013

どのバージョンのjavaとjaxbを使用していますか?
WarFox 2013

@WarFox xmlHeadersコマンドを使用したsetPropertyは、jdk1.6.0_24およびJAXBバージョン2.1では機能しません
Bryan Larson

3
java6またはjava7に関係なく、「内部」を追加する必要がありました。つまり、marshaller.setProperty( "com.sun.xml.internal.bind.xmlHeaders"、 "<?xml version = \" 1.0 \ "encoding = \" UTF-8 \ "?>");
Caoilte 2014

7

他の誰かがまだこの問題に苦しんでいる場合は、使用を検討してください

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

すべてのXML宣言を削除しString、出力ストリーム/メソッドの先頭に独自の宣言を書き込むだけです。


5

ドキュメントを依存させるDOCTYPE(たとえば、名前付きエンティティを使用する)と、スタンドアロンではなくなります。standalone="yes"なくなるため、XML宣言では許可されません。

ただし、スタンドアロンXMLはどこでも使用できますが、非スタンドアロンXMLは、外部をロードしないXMLパーサーには問題があります。

XMLをサポートしていないソフトウェアとの相互運用性を除いて、この宣言がどのように問題になるかはわかりませんが、いくつかの恐ろしい正規表現のスープです。


1
正確に言えば、xml宣言をbarfsするxml処理システムは非常に疑わしいようです。
StaxMan 2011年

1
それはどのように質問に答えますか?
ᄂᄀ 2014年

ドキュメントをどのように依存させるのDOCTYPEですか?
LII

3
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");

これはJDK1.7でうまくいきました。スタンドアロン= \ "no \"を削除して、残りのxml部分のみを取得できます


1
エラー:javax.xml.bind.PropertyException:名前:com.sun.xml.internal.bind.xmlHeaders値ます。<?xml version = "1.0"エンコード= "UTF-8">
aswzen

3

デフォルトのjavax.xmlパッケージのみを使用している場合は、マーシャラーのJAXB_FRAGMENTオプションを「true」に設定し(これにより、デフォルトのxml処理命令が省略されます)、XMLStreamWriterのwriteProcessingInstructionメソッドを使用して独自のパッケージを挿入できます。

xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
jaxbMarshaller.setProperty( Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.marshal(object, xmlStreamWriter);
xmlStreamWriter.writeEndDocument();


1

私には、コメントする「特権」を持つのに十分な高い「評判」がありません。;-)

@Debasis、指定したプロパティに注意してください。

"com.sun.xml.internal.bind.xmlHeaders"

する必要があります:

"com.sun.xml.bind.xmlHeaders" (without the "internal", which are not meant to be used by the public)

あなたがしたように「内部」プロパティを使用すると、javax.xml.bind.PropertyExceptionが発生します


1

プロパティの例外が発生した場合は、次の構成を追加します。

jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlDeclaration", Boolean.FALSE);
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);  

1

Java1.8とJAXB2.3.1を使用しています

まず、pom.xmlでjava1.8を使用していることを確認してください

<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

次に、ソースコードで使用しました:(キーは内部部分でした)

// remove standalone=yes
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

0

ちょうど試して

private String marshaling2(Object object) throws JAXBException, XMLStreamException {
    JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
    StringWriter writer = new StringWriter();
    writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
    jaxbMarshaller.marshal(object, writer);
    return writer.toString();
  }

0

あなたが持っている場合 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

しかし、これが欲しい: <?xml version="1.0" encoding="UTF-8"?>

ただしてください:

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.