У меня есть менеджер, который хочет заменить свое XML-решение на Java простым JaxB.После того, как я маршал, XML не выглядит таким, каким он был, и (насколько мне известно) я не вносил в него никаких изменений.Я могу ошибаться, возможно, я неправильно создаю JAXBContext, но сейчас кажется, что сам JaxB вносит изменения.
Одна из центральных проблем заключается в том, что JaxB удаляет инструкции обработки из оригиналадокумент.Обработка инструкций имеет решающее значение для нашего бизнеса.Мы используем их для отслеживания изменений текста в наших документах (что добавлено и удалено), а также для записи истории «разделов» текста (когда все это было впервые создано и откуда).Эти инструкции по обработке могут находиться на различном уровне документа, окружая обычный текст и узлы.Без этой информации документ был бы бессмысленным для наших клиентов.
Есть ли какой-нибудь способ сохранить эти инструкции по обработке из исходного документа при демаршалинге и маршалинге?Я видел людей, которые говорили на stackoverflow о добавлении инструкций обработки во время маршалинга, но я не вижу никаких вопросов, на которых, кажется, есть ответ о том, как сохранить СУЩЕСТВУЮЩИЕ инструкции обработки из исходного документа, и я ничего не вижу в сети.Я рассмотрел использование XMLAdaptor и XMLStreamReader, но я зашел в тупик.Они оба кажутся решениями, направленными на добавление ПИ, а не их сохранение.Но я не могу исключить, что, возможно, я использую их неправильно.
public class JAXBParser {
public static void main(String args[]) throws Exception {
JAXBContext context = JAXBContext.newInstance(MeasureDocType.class);
MeasureDocType mType = unmarshall("C:/Workspace/XCAMeasureParser - JAXB/processPlace/2018/20170SB__004798AMD.xca", context);
String measureText = marshal(context, mType);
System.out.println(measureText);
}
public static MeasureDocType unmarshall (String anXmlFileName, JAXBContext context) throws Exception {
XMLInputFactory xif = XMLInputFactory.newFactory();
XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource(anXmlFileName));
Unmarshaller unmarshaller = context.createUnmarshaller();
JAXBElement<MeasureDocType> root = unmarshaller.unmarshal(xsr, MeasureDocType.class);
return root.getValue();
}
public static String marshal(JAXBContext pContext, Object pObject) throws JAXBException {
StringWriter sw = new StringWriter();
Marshaller marshaller = pContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
if (pObject instanceof MeasureDocType) {
MeasureDocType measureDocType = (MeasureDocType) pObject;
ObjectFactory objectFactory = new ObjectFactory();
JAXBElement<MeasureDocType> jaxElement = objectFactory.createMeasureDoc(measureDocType);
marshaller.marshal(jaxElement, sw);
}
return sw.toString();
}
}