que*_*ner 29 java xml jaxb unmarshalling
有没有办法忽略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>
Run Code Online (Sandbox Code Playgroud)
ska*_*man 38
假设您的JAXB模型如下所示:
@XmlRootElement(name="foo")
public class Foo {
@XmlElement(name="element1")
String element1;
@XmlElement(name="element2")
String element2;
@XmlElement(name="bar")
Bar bar;
}
Run Code Online (Sandbox Code Playgroud)
然后只需删除bar字段Foo就会跳过<bar/>输入文档中的元素.
或者,用@XmlTransient而不是注释该字段@XmlElement,它也将被跳过.
bdo*_*han 12
JAXB将忽略任何未映射的属性.
实现明智(至少在EcliseLink JAXB(MOXy)中,我领导).当我们通过SAX解析器处理内容时(即输入是SAXSource),然后我们将负责构建对象的ContentHandler换成不对该部分进行处理的对象(org.eclipse.persistence.oxm.unmapped. UnmappedContentHandler).当我们使用StAX解析器处理内容时,我们只是前进到下一个映射事件.
如果您确实拥有与该节点对应的属性,则可以使用@XmlTransient对其进行注释,以使其成为未映射的属性.
所有您需要的都是将字段标记为@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
}
Run Code Online (Sandbox Code Playgroud)
xml:
<DeletedIds>
<DeletedId>
<id>1</id>
</DeletedId>
<DeletedId>
<id>2</id>
</DeletedId>
</DeletedIds>
Run Code Online (Sandbox Code Playgroud)
您必须使用 SAX 解析器和文档处理程序来有效地“跳过”不感兴趣的节点。您无法避免读取字节,但至少可以避免它们浪费额外的资源。
如果您的代码需要 DOM 树,那么您基本上使用 SAX 文档处理程序来生成 DOM 节点,但“跳过”不感兴趣的节点。肯定不如使用提供的 DOM 树生成器方便,但一个不错的权衡是,您无法忍受不需要的节点的额外内存开销,但您需要 DOM 树。
| 归档时间: |
|
| 查看次数: |
63129 次 |
| 最近记录: |