相对于在运行时加载的xml架构序列化java对象

时间:2010-02-24 08:42:31

标签: java xml xml-serialization xsd

我将XML文档称为三层,如果其结构布局如下:根元素包含一些容器元素(我将它们称为实体),他们每个人都有一些simpleType元素(我将它们称为属性)。 这样的事情:

<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<String, Map <String, Object>>的数据的xmlDocument,其中第一个键对应于实体,第二个键对应于此实体的属性,并且该值对应于此属性的值,然后将其转换为正确的java type(例如,如果架构将属性值设置为xs:int,则应将其强制转换为Integer)。

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

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

4 个答案:

答案 0 :(得分:2)

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

基本上你运行一个ant脚本来生成处理模式的bean,然后迭代节点来构建你的地图。

答案 1 :(得分:1)

我认为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工具为您创建类。

答案 2 :(得分:1)

如果架构在编译时未知,则需要反思。

我建议您查看一些像{xstream}这样的other tools

我可以推荐简单的框架,或者你可以使用纯dom4j解析/扭曲xml为I did in the timefinder project。我使用'纯'方法,因为我的对象图中有循环,但我希望xml可以用xml架构验证(我不想使用JAXB)

答案 3 :(得分:0)

我终于使用Castor库来解析模式并手动分配数据类型。