在处理具有相当复杂的XML结构的Web服务响应时,我只对一小部分信息感兴趣。让我们考虑使用JAXB必须在这种情况下使用。
举个例子,假设我只对检索d(可以建模为单个JAXB bean)感兴趣:
a
b1
c1
c2
b2
d
除了检索d?
之外,忽略其他所有内容的最快建议方法是什么?答案 0 :(得分:3)
我认为最快的方法取决于xml的格式。例如。您可以创建自己的InputStream
来包装真实的InputStream
,并且只是在寻找"<d>"
来触发您开始将数据传递到jaxb。
e.g。
InputStream is = // get real stream
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller u = jc.createUnmarshaller();
Object o = u.unmarshal( new MySpecialStream(is) );
如果您需要更类似xml的方法,那么您可以创建自己的XMLStreamReader
,如果您位于d
元素内,则只会传递某些调用。
e.g。
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller u = jc.createUnmarshaller();
XMLStreamReader xsr = XMLInputFactory.newInstance().createXMLStreamReader( ... );
Object o = u.unmarshal( new MyXSRWrapper(xsr) );
答案 1 :(得分:3)
注意:我是EclipseLink JAXB (MOXy)主管,是JAXB 2(JSR-222)专家组的成员。
您可以通过几种不同的方式处理此用例:
选项#1 - StreamFilter
任何JAXB实施
您可以使用带有XMLStreamReader
的StAX StreamFilter
来过滤掉您不希望映射到的XML文档部分:
选项#2 - MOXy JAXB中的@XmlPath
您可以在MOXy中使用@XmlPath
扩展程序:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class A {
@XmlPath("b2/d/text()")
private String d;
}
了解更多信息
答案 2 :(得分:0)
使用XPath选择所需的元素作为DOM节点,并使用该选定的节点解组。