如何使用JAXB进行编组时添加DOCTYPE和xml处理指令?

2022-09-04 01:41:02

我正在编组(序列化)JAXB Bean以输出流。如何将 DOCTYPE 声明和 xml 处理指令添加到输出中?

我目前正在进行这样的编组:

JAXBContext jaxbContext = JAXBContext.newInstance("com.example.package");
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = schemaFactory.newSchema(schemaSource);
marshaller.setSchema(schema);

marshaller.marshal(object, output);

我希望输出看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Something SYSTEM "some.dtd">
<?xml-stylesheet type="text/xsl" href="some.xsl"?>

JAXB bean是生成的代码,所以我不想改变它们。

有一些技巧和未记录的技巧(请参阅使 JAXB 生成 XML 处理指令)来添加 xml 处理指令doctype。但是,执行此操作的首选或正确方法是什么?


答案 1

JAXB RI 具有专有属性(请参见 XML 前导码控件Marshallercom.sun.xml.bind.xmlHeaders

此属性允许您指定 XML 前导码(声明)以及它后面的任何其他 PI、注释和声明。仅当封送到 、 或 时,此属性才会生效。请注意,此属性与该属互。如果该属性未更改或设置为 false,则 JAXB 将始终编写其 XML 前导码,因此此属性只能用于编写 PI、注释等。另一方面,如果它设置为 true,那么 JAXB 将不会编写自己的 XML 前导码,因此此属性可能包含定制 XML 前导码。<?xml ...>DOCTYPEOutputStreamWriterStreamResultMarshaller.JAXB_FRAGMENTDOCTYPE

这应该可以满足您的需要。如果您使用的是Java5和JAXB RI,那么这应该可以正常工作。如果您将 Java6 与其附带的 JAXB 实现一起使用,则名称可能不同,因此请尝试。com.sun.xml.bind.xmlHeaderscom.sun.xml.internal.bind.xmlHeaders


答案 2

推荐