web-dev-qa-db-ja.com

生成されたXMLから「standalone = "yes"」を削除

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
76
Johan Pelgrim
marshaller.setProperty("com.Sun.xml.bind.xmlDeclaration", Boolean.FALSE);

使用することができます

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

ただし、このベストプラクティスを検討しません。

57
Sam

jDK1.6の一部であるJAXBで

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

どちらかを使用できます

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

または

marshaller.setProperty("com.Sun.xml.bind.xmlDeclaration", Boolean.FALSE)

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

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

によって

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

standalone = "yes"プロパティを回避して、生成されたxmlに追加します。

56
WarFox

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

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

すべてのXML宣言を削除し、出力ストリーム/メソッドの先頭に独自のStringを記述する

6
benez

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

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

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

4
Kornel
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でうまくいきました。 standalone =\"no \"を削除すると、残りのxml部分のみを取得できます

3
Debasis Das

デフォルトの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();
2
eddo

次を使用できます。marshaller.setProperty( "jaxb.fragment"、Boolean.TRUE);

私にとってはJava 8

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

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
Alisha Setia

私はコメントするための「特権」を持っているほど高い「評判」を持っていません。 ;-)

@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が返されます。

0
Ari

ちょうど試して

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
Bernardo Mello