JAXB解组未知XML内容的子集
我需要unmarshall
组未知XML
内容的子集,使用该未编组对象,我需要修改一些内容并使用原始XML重新绑定相同的XML内容(子集)。
示例输入XML:
Robin SM Active .....
需要通过将其他XML部分保持相同来单独解组标记。 需要修改
标记中的元素并将修改后的XML部分与原始文件绑定,如下所示:
预期输出XML:
Robin_123 Senior Member 1 .....
我的问题:
-
这个要求的可能解决方案是什么? (除了
DOM
解析 – 因为XML contnet非常庞大) -
在
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