結果のXMLでstandalone = "yes"が生成されないようにするJAXB設定を知っていますか?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
回答:
このプロパティ:
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
...次のものを持たないように使用できます:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
ただし、このベストプラクティスは考慮しません。
JDK1.6の一部であるJAXBで
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
standalone
、XML宣言の属性を削除することです。
あなたはどちらかを使うことができます
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"プロパティが回避されます。
ドキュメントを依存させるDOCTYPE
(たとえば、名前付きエンティティを使用する)と、スタンドアロンではなくなります。standalone="yes"
なくなるため、XML宣言では許可されません。
ただし、スタンドアロンXMLはどこでも使用できますが、非スタンドアロンXMLは、外部をロードしないXMLパーサーには問題があります。
XMLをサポートしていないソフトウェアとの相互運用性を除いて、この宣言がどのように問題になるかはわかりませんが、いくつかの恐ろしい正規表現のスープです。
DOCTYPE
ですか?
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部分のみを取得できます
デフォルトの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);
Java8で動作します
プロパティの例外が発生した場合は、次の構成を追加します。
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);
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\"?>");
ちょうど試して
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();
}
あなたが持っている場合 <?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\"?>");