30

有什么方法可以忽略 Jaxb 解析中的元素?我有一个大的 XML 文件,如果我可以忽略其中一个大而复杂的元素,那么它的解析速度可能会快很多。

如果它甚至根本无法验证元素内容并解析文档的其余部分,即使该元素不正确,那就更好了。

例如:这应该只生成 Foo.element1 和 Foo.element2

<foo>
    <element1>I want this</element1>
    <element2>And this</element2>
    <bar>
       <a>ALL of bar should be ignored</a>
       <b>this also should be ignored</b>
       <c>
           <x>a lot of C that take time to process</x>
       </c>
       <c>
            <x>a lot of C that take time to process</x>
       </c>
       <c>
          <x>a lot of C that take time to process</x>
       </c>
      <c>
          <x>a lot of C that take time to process</x>
      </c>
  </bar>
</foo>
4

4 回答 4

38

假设您的 JAXB 模型如下所示:

@XmlRootElement(name="foo")
public class Foo {

   @XmlElement(name="element1")
   String element1;

   @XmlElement(name="element2")
   String element2;

   @XmlElement(name="bar")
   Bar bar;
}

然后简单地删除该bar字段Foo将跳过<bar/>输入文档中的元素。

@XmlTransient或者,用代替注释该字段@XmlElement,它也将被跳过。

于 2011-02-18T16:57:22.017 回答
12

JAXB 将忽略任何未映射的属性。

实施方面(至少在我领导的EcliseLink JAXB (MOXy)中)。当我们通过 SAX 解析器处理内容(即输入是 SAXSource)时,我们将负责构建对象的 ContentHandler 换成不对该部分进行处理的 ContentHandler(org.eclipse.persistence.oxm.unmapped.未映射内容处理程序)。当我们通过 StAX 解析器处理内容时,我们只是前进到下一个映射事件。

如果您确实具有与该节点对应的属性,则可以使用@XmlTransient对其进行注释以使其成为未映射的属性。

于 2011-02-18T16:56:06.130 回答
7

所有你需要的都是将字段标记为@XmlTransient(@XmlTransient 注释应该隐藏不需要的字段)。下面的例子

爪哇:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "DeletedIds")
public class DeletedIds {

    @XmlElement(name = "DeletedId")
    private List<DeletedId> id;    

    @XmlTransient
    @XmlElement(name = "success")
    private String success;

    //getters&setters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class DeletedId {

    private int id;

    //getters&setters
}

xml:

<DeletedIds>
    <DeletedId>
        <id>1</id>
    </DeletedId>
    <DeletedId>
        <id>2</id>
    </DeletedId>
</DeletedIds>
于 2017-01-03T13:28:36.320 回答
1

您必须使用 SAX 解析器和有效“跳过”不感兴趣的节点的文档处理程序。你无法绕过读取字节,但至少你可以绕过让它们浪费额外的资源。

如果您的代码需要 DOM 树,那么您基本上使用生成 DOM 节点的 SAX 文档处理程序,但“跳过”不感兴趣的节点。使用提供的 DOM 树生成器肯定不那么方便,但一个不错的权衡是你不能忍受不需要的节点的额外内存开销,但你需要 DOM 树。

于 2011-02-18T16:48:04.880 回答