【问题标题】:How to add DOCTYPE and xml processing instructions when marshalling with JAXB?使用 JAXB 编组时如何添加 DOCTYPE 和 xml 处理指令?
【发布时间】:2010-05-27 07:42:13
【问题描述】:

我正在编组(序列化)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 是生成的代码,所以我不想更改它们。

添加xml processing instructionsdoctype 有一些技巧和未记录的技巧(请参阅Making JAXB generate an XML processing instruction)。但是,首选或正确的方法是什么?

【问题讨论】:

    标签: java xml jaxb marshalling


    【解决方案1】:

    JAXB RI 有一个专有的Marshaller 属性com.sun.xml.bind.xmlHeaders(请参阅XML Preamble Control

    此属性允许您指定一个 XML 序言 (&lt;?xml ...&gt; 声明)和任何其他 PI, cmets, DOCTYPE 声明 跟随它。该属性生效 只有当你编组到 OutputStreamWriterStreamResult。请注意,这 属性与 Marshaller.JAXB_FRAGMENT 财产。 如果该属性未触及或设置 为 false,则 JAXB 将始终写入 它的 XML 序言,所以这个属性可以 仅用于编写 PI、cmets、 DOCTYPE 等。另一方面,如果 它设置为 true,则 JAXB 不会 编写自己的 XML 序言,所以这个 属性可能包含自定义 XML 序言。

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

    【讨论】:

    • 你的意思是相反的吧?如果您使用的是 JAXB RI,那么 com.sun.xml.internal.bind.xmlHeaders 将起作用,如果使用 jaxb impl,那么它是 com.sun.xml.bind.xmlHeaders 对吗?
    猜你喜欢
    • 2011-10-19
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2012-09-30
    • 1970-01-01
    相关资源
    最近更新 更多