我有一个经理想要用纯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();
}
}