[英]How to ignore (efficiently) most part of an XML structure when unmarshalling with JAXB?
在处理具有相当复杂的XML结构的Web服务响应时,我只对一小部分信息感兴趣。 让我们考虑在这种情况下必须使用JAXB。
举个例子,假设我只对检索d(可以建模为单个JAXB bean)感兴趣:
a
b1
c1
c2
b2
d
除了检索d之外,忽略其他所有内容的最快建议方法是什么?
我认为最快的方法取决于xml的格式。 例如,您可以创建自己的InputStream
来包装真正的InputStream
并且只是在寻找"<d>"
以触发您开始将数据传递到jaxb。
例如
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
元素中,它只传递某些调用。
例如
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller u = jc.createUnmarshaller();
XMLStreamReader xsr = XMLInputFactory.newInstance().createXMLStreamReader( ... );
Object o = u.unmarshal( new MyXSRWrapper(xsr) );
注意:我是EclipseLink JAXB(MOXy)的负责人,也是JAXB 2( JSR-222 )专家组的成员。
您可以通过几种不同的方式处理此用例:
选项#1 - StreamFilter
任何JAXB实现
您可以将StAX XMLStreamReader
与StreamFilter
一起使用,以过滤掉您不希望映射到的XML文档部分:
选项2 - @XmlPath
在莫西JAXB
您可以在@XmlPath
中使用@XmlPath
扩展:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class A {
@XmlPath("b2/d/text()")
private String d;
}
欲获得更多信息
使用XPath选择所需的元素作为DOM节点,并使用该选定节点解组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.