【问题标题】:Serializing java objects with respect to xml schema loaded at runtime关于在运行时加载的 xml 模式序列化 java 对象
【发布时间】:2010-02-24 08:42:31
【问题描述】:

如果 XML 文档的结构如下所示,我将其称为 三层:根元素包含一些容器元素(我将它们称为 entities),它们每个内部都有一些 simpleType 元素(我将它们称为 properties)。 类似的东西:

<data>
 <spaceship>
    <number>1024</number>
    <name>KTHX</name>
 </spaceship>
 <spaceship>
    <number>1624</number>
    <name>LEXX</name>
 </spaceship>
 <knife>
    <length>10</length>
 </knife>
</data>

其中spaceship 是一个实体,number 是一个属性。

我的问题如下:

给定

schema:一个任意 xsd 文件,描述一个三层文档,在运行时加载。 xmlDocument:符合schema的xml文档。

创建

一个 Map&lt;String, Map &lt;String, Object&gt;&gt; 包含来自 xmlDocument 的数据,其中第一个键对应于实体,第二个键对应于该实体的属性,值对应于该属性的值,在将其转换为适当的 java 类型(例如,如果架构将属性值设置为xs:int,则应将其强制转换为Integer)。

使用现有库实现此结果的最简单方法是什么?

P。 S。 JAXB 在这里并不是一个真正的选择。架构在编译时可能是任意且未知的。我还希望避免过度使用反射(与将 bean 转换为映射相关)。我正在寻找可以让我在解析 xml 时进行类型转换的东西。

【问题讨论】:

    标签: java xml xml-serialization xsd


    【解决方案1】:

    我认为XMLBeans 值得一试;不止一次挽救了这一天...

    基本上,您运行一个 ant 脚本来生成处理架构的 bean,然后您遍历节点以构建您的地图。

    【讨论】:

    • 好吧,我考虑过静态绑定并使用反射从生成的 bean 创建映射(类似于 commons-beanutils BeanMap)。但是,它对我来说似乎有点太笨拙了。也许存在更轻量级的方法?我认为应该可以在解析 xml 时进行类型转换,例如使用 DOM 的SchemaTypeInfo。但是,我没有找到任何现成的解决方案。
    【解决方案2】:

    我认为 JAXB (tutorial here) 是最简单的方法。

    创建您的 XML 结构,如:

    @XmlRootElement
    class data {
     public List<SpaceShipType> spaceship;
     public KnifeType knife;
    }
    
    class SpaceShipType {
     public int number;
     public String name;
    }
    
    class KnifeType {
     public int length;
    }
    

    然后创建对象树,并使用JAXB.marshall() 编写XML。 如果您有现有的 XSD,请使用 xjc 工具为您创建类。

    【讨论】:

    • 我认为我在陈述我的问题时有点不清楚。架构在编译时是未知的,我们所知道的只是它描述了一个三层结构。
    【解决方案3】:

    如果架构在编译时未知,您将需要反射。

    我建议看看一些other tools,比如xstream。

    我可以推荐简单的框架,或者您可以使用纯 dom4j 作为I did in the timefinder project 解析/写入 xml。我使用了“纯”方法,因为我的对象图中有循环,但我希望可以使用 xml 模式验证 xml(并且我不想使用 JAXB)

    【讨论】:

      【解决方案4】:

      我终于开始使用 Castor 库来手动解析架构和分配数据类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-19
        • 2018-02-07
        相关资源
        最近更新 更多