JAXB 2.0 - 如何跳过节点处理并将它们作为String返回

时间:2010-02-04 14:52:56

标签: java xml jaxb marshalling jaxb2

我正在使用JAXB 2.0处理XML文档,其中我需要映射到Java对象的信息(在我的示例中为'id')并运行一些业务逻辑。这里一切都很好。

但是这些XML文档总是包含大约500个节点的集合,我只想以原始xml格式保存到数据库中,所以我只对String形式的XML感兴趣。在我看来,将这些节点解组为Java对象并稍后再将它们编组为XML以将它们保存到数据库中是没有意义的。

有没有办法注释一个属性并使它只是将整个XML节点保存为String?这是该课程的当前版本:

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

    @XmlElement(name = "id")
    public long id;

    @XmlElement(name = "child", type = String.class)
    @XmlElementWrapper(name = "children")
    public List<String> children = new ArrayList<String>();

}

解组XML文档后,children.size()返回正确的childran数,但它们仍为null。

XML文档如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<parent>
    <id>45</id>
    <children>
        <child>
            <name>Crash Dummy</name>
            <age>21</age>
        </child>
        <child>
            <name>Rockstar Programmer</name>
            <age>12</age>
        </child>
    </children>
</parent>

提前感谢每一个提示或可能的解决方案。

1 个答案:

答案 0 :(得分:2)

不,JAXB不允许这样的事情(我也不知道任何其他基于树的XML API)。

我不相信解析整个文档的开销会很糟糕。毕竟,无论如何都需要解析文档,以便找出静态节点树的起始位置和结束位置。将节点树存储为JAXB节点并不比在大型blob中存储节点树更糟糕。

如果表现真的对你很重要,我会建议两种选择:

  • 使用更快的API解析XML文档,例如StAX(尽管使用低级API获取解析器可能非常困难)
  • 将数据存储为两个XML文件。一个包含您实际需要的数据,另一个包含您需要随身携带的“静态”数据。根据您对最终文档的处理方式,也可以使用XInclude之类的内容。