Как добавить инструкции по обработке DOCTYPE и xml при сортировке с помощью JAXB?

Я собираю (сериализую) JAXB-бины для вывода потока. Как добавить декларацию 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 и тип документа. Но какой предпочтительный или правильный способ сделать это?

1 ответ

Решение

JAXB RI имеет запатентованную Marshaller имущество com.sun.xml.bind.xmlHeaders (см. Контроль преамбулы XML:

Это свойство позволяет указать преамбулу XML (<?xml ...> декларация) и любые дополнительные ИП, комментарии, DOCTYPE декларация, которая следует за этим. Это свойство вступает в силу только тогда, когда вы OutputStream, Writer, или же StreamResult, Обратите внимание, что это свойство взаимодействует с Marshaller.JAXB_FRAGMENT имущество. Если это свойство не трогать или установить в значение false, JAXB всегда будет писать свою преамбулу XML, поэтому это свойство можно использовать только для написания PI, комментариев, DOCTYPEи т. д. С другой стороны, если для него установлено значение true, JAXB не будет писать свою собственную преамбулу XML, поэтому это свойство может содержать настраиваемую преамбулу XML.

Это должно делать то, что вам нужно. Если вы используете Java5 и JAXB RI, то это должно сработать. Если вы используете Java6 с включенной реализацией JAXB, com.sun.xml.bind.xmlHeaders имя может быть другим, поэтому попробуйте com.sun.xml.internal.bind.xmlHeaders вместо.

Другие вопросы по тегам