繁体   English   中英

在使用JAXB进行解组时,如何忽略(有效)XML结构的大部分内容?

[英]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 XMLStreamReaderStreamFilter一起使用,以过滤掉您不希望映射到的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM