JAXB: Как маршалировать и восстанавливать инструкции по обработке из оригинального документа? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть менеджер, который хочет заменить свое 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();
  }

}
...