我将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
。
创建
包含来自Map<String, Map <String, Object>>
的数据的xmlDocument
,其中第一个键对应于实体,第二个键对应于此实体的属性,并且该值对应于此属性的值,然后将其转换为正确的java type(例如,如果架构将属性值设置为xs:int
,则应将其强制转换为Integer
)。
使用现有库实现此结果的最简单方法是什么?
P上。 S. JAXB在这里不是一个真正的选择。架构可能是任意的,在编译时是未知的。此外,我希望避免过度使用反射(与将bean转换为地图相关联)。我正在寻找能让我在解析xml时进行类型转换的东西。
答案 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库来解析模式并手动分配数据类型。