【问题标题】:How to ignore (efficiently) most part of an XML structure when unmarshalling with JAXB?使用 JAXB 解组时如何(有效地)忽略 XML 结构的大部分?
【发布时间】:2011-09-20 21:41:16
【问题描述】:

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

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

a
  b1
    c1
    c2
  b2
    d

除了检索 d 之外忽略其他所有内容的最快推荐方法是什么?

【问题讨论】:

  • 我猜你不能使用 xpath,你必须使用 jaxb,对吗?
  • 您好,感谢您提出这个问题。实际上,我也在尝试做类似的事情,但由于某种原因,它没有按预期工作。我也尝试了这个答案中提到的东西。我尝试了这种方法和作者博客中的示例,但 JAXB 编组仍然无法按预期使用 @XmlPath。似乎使用和不使用 @XmlPath 生成的 XML 是相同的。您能否查看此示例并提供您的答案:stackoverflow.com/questions/67500565/…

标签: java xml jaxb unmarshalling


【解决方案1】:

注意:我是 EclipseLink JAXB (MOXy) 负责人,也是 JAXB 2 (JSR-222) 专家组的成员。

有几种不同的方法可以处理这个用例:

选项 #1 - StreamFilter 任何 JAXB 实现

您可以使用 StAX XMLStreamReaderStreamFilter 过滤掉您不想映射到的 XML 文档部分:

选项 #2 - MOXy JAXB 中的 @XmlPath

您可以在 MOXy 中使用 @XmlPath 扩展:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class A {

    @XmlPath("b2/d/text()")
    private String d;

}

更多信息

【讨论】:

    【解决方案2】:

    我认为最快的方法将取决于 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) );
    

    【讨论】:

    【解决方案3】:

    使用 XPath 选择所需元素作为 DOM 节点并使用该选定节点解组。

    【讨论】:

    • 有时为此创建 DOM 树会浪费大量时间和空间。
    • @biziclop 所以是过早的优化。 “最快”是指什么,开发时间或处理时间,哪个更昂贵?
    • 我不知道,但正如我所指出的,DOM 通常根本不是一种选择。
    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 2010-09-21
    • 2015-06-19
    相关资源
    最近更新 更多