我有一位经理想用普通的 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();
}
}