有没有办法忽略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>
答案 0 :(得分: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
对字段进行注释,并且也会跳过它。
答案 1 :(得分:12)
JAXB将忽略任何未映射的属性。
明智的实施(至少EcliseLink JAXB (MOXy),我领导)。当我们通过SAX解析器处理内容(即输入是SAXSource)时,我们将负责构建对象的ContentHandler换成不对该部分进行处理的对象(org.eclipse.persistence.oxm.unmapped。 UnmappedContentHandler)。当我们使用StAX解析器处理内容时,我们只是前进到下一个映射事件。
如果您拥有与该节点对应的属性,则可以使用@XmlTransient对其进行注释,以使其成为未映射的属性。
答案 2 :(得分:3)
你需要它的所有标记字段为@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>
答案 3 :(得分:1)
你必须使用一个SAX解析器,以及一个有效地跳过&#34;的文件处理程序。不感兴趣的节点。你无法绕过读取字节,但至少你可以绕过它们浪费额外的资源。
如果您的代码需要DOM树,那么您基本上使用生成DOM节点的SAX文档处理程序,但是&#34;跳过&#34;不感兴趣的节点。使用提供的DOM树生成器绝对不太方便,但是一个不错的权衡是你不能忍受不需要的节点的额外内存开销,但你需要DOM树。