JAXB фрагментированный маршаллинг - PullRequest
7 голосов
/ 15 февраля 2012

У меня возникли проблемы с успешной сортировкой с использованием свойства Marshaller.JAXB_FRAGMENT.Вот простая версия XML, который я пытаюсь вывести.

<Import>
    <WorkSets>
        <WorkSet>
            <Work>
            <Work>
            ...
            ..
            ...
        </WorkSet>
        <WorkSet>
            <Work>
            <Work>
            ...
        </WorkSet>
    <WorkSets>
<Import>

Элементы <Import> и <WorkSets> по сути являются просто элементами-контейнерами, которые содержат большое количество <WorkSet> & <Work>элементы.В настоящее время я пытаюсь маршалировать в <WorkSet>.

  1. Возможно ли сначала маршалировать элементы <Import> и <WorkSets>, а затем маршала в элементе <WorkSet> или вывод заключен в теги <Import><WorkSets>?
  2. Когда я выполняю маршалинг на уровне WorkSet, он присоединяет атрибут xmlns='http://namespace.com' к тегу WorkSet, есть ли способ маршалинга без использования атрибута пространства имен?подключен к Workset?

1 Ответ

17 голосов
/ 15 февраля 2012

По сути, вместо создания полного дерева объектов с объектами-контейнерами вы хотите иметь возможность потоковой передачи коллекции экземпляров WorkSet для маршалинга с использованием JAXB.

Подход, который я выбрал бы, заключается в следующем:используйте XMLStreamWriter и упорядочите объекты WorkSet, обернув их в JAXBElement.Я не тестировал пример кода под рукой, поэтому вот пример грубого кода, который должен поставить вас на путь записи:

FileOutputStream fos = new FileOutputStream("foo.xml");
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(fos);

writer.writeStartDocument();
writer.writeStartElement("Import");
writer.writeStartElement("WorkSets");

JAXBContext context = JAXBContext.newInstance(WorkSet.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
for (WorkSet instance : instances)
{
    JAXBElement<WorkSet> element = new JAXBElement<WorkSet>(QName.valueOf("WorkSet"), WorkSet.class, instance);
    m.marshal(element, writer);
}

writer.writeEndDocument(); // this will close any open tags
writer.close();

Примечание: Вышеприведенное полностью не проверено иможет быть что-то напутано в оберточной части, чтобы написать каждый экземпляр WorkSet.Вам нужно обернуть экземпляры WorkSet, потому что они не будут помечены @XmlRootElement, а в противном случае JAXB откажется маршалировать объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...