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

时间:2011-09-20 21:41:16

标签: java xml jaxb unmarshalling

在处理具有相当复杂的XML结构的Web服务响应时,我只对一小部分信息感兴趣。让我们考虑使用JAXB必须在这种情况下使用。

举个例子,假设我只对检索d(可以建模为单个JAXB bean)感兴趣:

a
  b1
    c1
    c2
  b2
    d

除了检索d?

之外,忽略其他所有内容的最快建议方法是什么?

3 个答案:

答案 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节点,并使用该选定的节点解组。