JAXB:如何从原始文档中整理和恢复处理指令?

时间:2019-06-10 20:11:03

标签: jaxb marshalling processing-instruction

我有一个经理想要用纯JaxB替换他们的XML Java解决方案。编组后,XML看起来就好像没有进来一样,而且(据我所知)我没有对其进行任何更改。我可能是错的,也许我没有正确创建JAXBContext,但是现在看来JaxB本身正在进行更改。

中心问题之一是JaxB正在从原始文档中剥离处理指令。处理说明对我们的业务至关重要。我们使用它们来跟踪文档中文本的更改(添加和删除的内容),以及记录文本“部分”的历史记录(首次创建整个内容以及从何处创建内容)。这些处理指令可以在文档的各个级别上,围绕纯文本和节点。没有这些信息,该文档对我们的客户将毫无意义。

在拆封和封送处理时,是否有某种方法可以保留原始文档中的这些处理指令?我曾见过一些人在编组过程中谈论关于ADDING处理指令的stackoverflow,但是我看不到任何有关如何保留原始文档中现有处理指令的问题,而且网上也看不到任何东西。我已经研究过使用XMLAdaptor和XMLStreamReader,但是我走到了尽头。它们似乎都适合于添加PI,而不是保留它们的解决方案。但是我不能排除可能我在错误地使用它们。

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();
  }

}

0 个答案:

没有答案