java JAXB -忽略元素

r9f1avp5  于 2023-04-19  发布在  Java
关注(0)|答案(4)|浏览(181)

我有一个很大的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>
j2cgzkjk

j2cgzkjk1#

假设你的JAXB模型看起来像这样:

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

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

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

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

那么简单地从Foo中移除bar字段将跳过输入文档中的<bar/>元素。
或者,用@XmlTransient而不是@XmlElement注解字段,它也将被跳过。

46qrfjad

46qrfjad2#

JAXB将忽略任何未Map的属性。
实施明智(至少在EcliseLink JAXB (MOXy)中,当我们通过SAX解析器处理内容时(即输入是SAXSource),然后我们将负责构建对象的ContentHandler替换为不处理该部分的ContentHandler(org.eclipse.persistence.oxm.unmapped.UnmappedContentHandler)。当我们使用通过StAX解析器处理内容时,我们只需前进到下一个Map事件。
如果您确实有一个属性对应于该节点,则可以使用@XmlTransient对其进行注解,使其成为未Map的属性。

xdyibdwo

xdyibdwo3#

你所需要的就是将字段标记为@XmlTransient(@XmlTransient注解应该隐藏不需要的字段)。
JavaEE:

@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>
htrmnn0y

htrmnn0y4#

您必须使用SAX解析器和文档处理程序来有效地“跳过”不感兴趣的节点。
如果您的代码需要DOM树,那么您基本上可以使用SAX文档处理程序来生成DOM节点,但“跳过”不感兴趣的节点。这肯定不如使用提供的DOM树生成器方便,但一个不错的折衷是,您不能忍受不需要的节点的额外内存开销,但您需要DOM树。

相关问题