首页 > 解决方案 > JAXB:如何编组和恢复原始文档中的处理指令?

问题描述

我有一位经理想用普通的 JaxB 替换他们的 XML java 解决方案。一旦我编组,XML 不会像它进入的那样出来,而且(据我所知)我没有对其进行任何更改。我可能是错的,也许我没有正确创建 JAXBContext,但现在似乎 JaxB 本身正在做出改变。

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

在解组和编组时,是否有某种方法可以保留原始文档中的这些处理指令?我看到人们在 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();
  }

}

标签: jaxbmarshallingprocessing-instruction

解决方案


推荐阅读