到目前为止,我一直在处理扩展程序,方法是定义一个具有“name”和“value”属性的占位符元素,如下例所示
<root>
<typed-content>
...
</typed-content>
<extension name="var1" value="val1"/>
<extension name="var2" value="val2"/>
....
</root>
我现在打算转用 xsd:any 。如果你能帮助我选择最好的方法,我将不胜感激
谢谢
答案 0 :(得分:2)
<xsd:any processContents="strict">
,人们可以在不更改原始架构的情况下为其XML实例文档添加扩展。这是它给你带来的重要好处。<xsd:any>
,则无关紧要。<xsd:any>
。这是可以理解的,因为它们没有关于它可能包含什么的信息,所以它们通常会给你一个无类型的占位符。它是在运行时处理它的应用程序代码。 JAXB是特别的(至少RI)只是它的一个拳头,但它是可行的。<xsd:any>
使程序员的生活变得更加困难,但是如果你需要支持任意扩展点,这就是这样做的方法。但是,如果您的扩展程序定义明确,并且没有更改,则可能不值得激怒因素。答案 1 :(得分:1)
关于第3点
绑定工具通常无法处理 非常优雅。这是 可以理解,因为他们没有 有关它可能的信息 包含,所以他们通常会给你 一个无类型的占位符。它起来了 用于处理该问题的应用程序代码 运行。 JAXB特别(RI, 至少)做了一点点, 但它是可行的。
这对应于JAXB中的@XmlAnyElement注释。行为如下:
@XmlAnyElement - 将所有内容保留为DOM节点
如果使用此批注对属性进行批注,则XML文档的相应部分将保留为DOM节点。
@XMLAnyElement(lax = true) - 将已知元素转换为域对象
通过设置 lax = true ,如果JAXB的根类型对应于该QName,那么它会将该块转换为域对象。