我有一个要求unmarshall
未知的子集XML
内容,对于该未编组的对象,我需要修改一些内容并将相同的 XML 内容(子集)与原始 XML 重新绑定。
输入 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 部分与原始 XML 部分绑定,如下所示:
预期输出 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>
我的问题:
此要求的可能解决方案是什么?(Except DOM
解析 - 因为 XML 内容非常庞大)
有没有什么选择可以做到这一点JAXB2.0
?
请就此提出您的建议。
考虑使用以下方法缩小源文档的大小StAX API http://docs.oracle.com/javase/7/docs/api/javax/xml/stream/package-summary.html.
对于给定的示例,此代码创建一个 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();
那么这可以是传递给 JAXB http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/JAXB.html#unmarshal%28javax.xml.transform.Source,%20java.lang.Class%29 as a DOM源 http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/dom/DOMSource.html.
重写输出上的 XML 时可以使用类似的技术。
JAXB 似乎不接受StreamSource
直接,至少在 Oracle 1.7 实现中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)