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

JAXB:如何从原始文档封送和恢复处理指令?,jaxb,marshalling,processing-instruction,Jaxb,Marshalling,Processing Instruction,我有一位经理希望用普通JaxB替换他们的XML java解决方案。一旦我进行封送处理,XML就不会看起来像是输入了,而且(据我所知)我没有对它做任何更改。我可能错了,也许我没有正确地创建JAXBContext,但现在似乎JaxB本身正在进行更改 中心问题之一是JaxB正在从原始文档中剥离处理指令。处理说明对我们的业务至关重要。我们使用它们来跟踪文档中的文本更改(添加和删除的内容),并记录文本“部分”的历史(整个内容最初创建的时间和来源)。这些处理指令可以位于文档的各个级别,围绕纯文本和节点。如果

我有一位经理希望用普通JaxB替换他们的XML java解决方案。一旦我进行封送处理,XML就不会看起来像是输入了,而且(据我所知)我没有对它做任何更改。我可能错了,也许我没有正确地创建JAXBContext,但现在似乎JaxB本身正在进行更改

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

在解组和封送时,是否有某种方法可以保留原始文档中的这些处理指令?我曾看到有人在stackoverflow上谈论在封送处理期间添加处理指令,但我没有看到任何问题似乎对如何从原始文档中保留现有处理指令有答案,而且我在网上也没有看到任何问题。我已经考虑过使用XMLAdapter和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();
  }

}
公共类JAXBParser{
公共静态void main(字符串args[])引发异常{
JAXBContext context=JAXBContext.newInstance(MeasureDocType.class);
MeasureDocType mType=unmarshall(“C:/Workspace/XCAMeasureParser-JAXB/processPlace/2018/20170SB_u004798amd.xca”,上下文);
字符串measureText=marshal(上下文,mType);
System.out.println(measureText);
}
公共静态MeasuredActype解组器(字符串anXmlFileName,JAXBContext上下文)引发异常{
XMLInputFactory xif=XMLInputFactory.newFactory();
XMLStreamReader xsr=xif.createXMLStreamReader(新的StreamSource(anXmlFileName));
Unmarshaller Unmarshaller=context.createUnmarshaller();
JAXBElement root=unmarshaller.unmarshal(xsr,MeasureDocType.class);
返回root.getValue();
}
公共静态字符串封送处理(JAXBContext pContext,Object pObject)抛出JAXBException{
StringWriter sw=新的StringWriter();
Marshaller=pContext.createMarshaller();
setProperty(marshaller.JAXB_编码,“UTF-8”);
if(被测量对象类型的对象实例){
MeasuredOctType MeasuredOctType=(MeasuredOctType)POObject;
ObjectFactory ObjectFactory=新的ObjectFactory();
JAXBElement jaxElement=objectFactory.createMeasureDoc(measureDocType);
marshaller.marshall(jax元素,sw);
}
返回sw.toString();
}
}