我有一个要求unmarshall
未知的子集 XML
内容,对于未编码的对象,我需要修改一些内容并将相同的 XML 内容(子集)与原始 XML 重新绑定(bind)。
示例输入 XML:
<Message>
<x>
</x>
<y>
</y>
<z>
</z>
<!-- Need to unmarshall this content to "Content" - java Object -->
<Content>
<Name>Robin</Name>
<Role>SM</Role>
<Status>Active</Status>
</Content>
.....
</Message>
需要解码 <Content>
单独标记,通过保持其他 XML 部分相同。需要修改<Content>
中的元素标记并将修改后的 XML 部分与原始部分绑定(bind),如下所示:
预期输出 XML:
<Message>
<x>
</x>
<y>
</y>
<z>
</z>
<!-- Need to unmarshall this content to "Content" - java Object -->
<Content>
<Name>Robin_123</Name>
<Role>Senior Member</Role>
<Status>1</Status>
</Content>
.....
</Message>
我的问题:
此需求的可能解决方案是什么? (
DOM
解析除外 - 因为 XML 内容非常庞大)在
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();
这可以是 passed to JAXB作为DOMSource .
重写输出的 XML 时可以使用类似的技术。
JAXB 似乎不直接接受 StreamSource
,至少在 Oracle 1.7 实现中是这样。
关于java - JAXB 解码未知 XML 内容的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16796418/