standalone = "yes"が結果のXMLで生成されないようにするJAXB設定を知っていますか?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
marshaller.setProperty("com.Sun.xml.bind.xmlDeclaration", Boolean.FALSE);
使用することができます
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
ただし、このベストプラクティスを検討しません。
jDK1.6の一部であるJAXBで
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
どちらかを使用できます
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に追加します。
他の誰かがまだこの問題に苦しんでいる場合は、使用を検討することができます
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
すべてのXML宣言を削除し、出力ストリーム/メソッドの先頭に独自のString
を記述する
ドキュメントをDOCTYPE
に依存するようにした場合(たとえば、名前付きエンティティを使用する場合)、スタンドアロンではなくなり、したがってstandalone="yes"
はXML宣言では許可されません。
ただし、スタンドアロンXMLはどこでも使用できますが、非スタンドアロンは外部をロードしないXMLパーサーにとって問題があります。
XMLをサポートしていないが、恐ろしい正規表現のスープをサポートするソフトウェアとの相互運用性を除いて、この宣言がどのように問題になるかはわかりません。
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部分のみを取得できます
デフォルトの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();
次を使用できます。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);
私はコメントするための「特権」を持っているほど高い「評判」を持っていません。 ;-)
@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が返されます。
ちょうど試して
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();
}