JAXB解组未知XML内容的子集

我需要unmarshall组未知XML内容的子集,使用该未编组对象,我需要修改一些内容并使用原始XML重新绑定相同的XML内容(子集)。

示例输入XML:

          Robin SM Active  .....  

需要通过将其他XML部分保持相同来单独解组标记。 需要修改标记中的元素并将修改后的XML部分与原始文件绑定,如下所示:

预期输出XML:

          Robin_123 Senior Member 1  .....  

我的问题:

  1. 这个要求的可能解决方案是什么? (除了DOM解析 – 因为XML contnet非常庞大)

  2. JAXB2.0有没有选择呢?

请提供您的建议。

考虑使用StAX API将源文档缩小到适当大小。

对于给定的示例,此代码创建一个DOM文档,其中包含Content元素的根元素:

 class ContentFinder implements StreamFilter { private boolean capture = false; @Override public boolean accept(XMLStreamReader xml) { if (xml.isStartElement() && "Content".equals(xml.getLocalName())) { capture = true; } else if (xml.isEndElement() && "Content".equals(xml.getLocalName())) { capture = false; return true; } return capture; } } XMLInputFactory inFactory = XMLInputFactory.newFactory(); XMLStreamReader reader = inFactory.createXMLStreamReader(inputStream); reader = inFactory.createFilteredReader(reader, new ContentFinder()); Source src = new StAXSource(reader); DOMResult res = new DOMResult(); TransformerFactory.newInstance().newTransformer().transform(src, res); Document doc = (Document) res.getNode(); 

然后可以将其作为DOMSource 传递给JAXB 。

在输出上重写XML时可以使用类似的技术。

JAXB似乎不直接接受StreamSource ,至少在Oracle 1.7实现中是这样。

您可以使用@XmlAnyElement在类上注释Object属性,默认情况下,未映射的内容将作为DOM节点捕获。 如果在DomHandler上指定了DomHandler ,则可以控制格式。 以下是一个示例的链接,其中内容保存为String

  • JAXB按原样使用String