使用xsd:any用于可扩展模式

时间:2011-02-03 02:37:40

标签: java web-services xsd jaxb xmlbeans

到目前为止,我一直在处理扩展程序,方法是定义一个具有“name”和“value”属性的占位符元素,如下例所示

<root>
   <typed-content>
      ...
   </typed-content>
   <extension name="var1" value="val1"/>
   <extension name="var2" value="val2"/>
....
</root>

我现在打算转用 xsd:any 。如果你能帮助我选择最好的方法,我将不胜感激

  1. 如果我指定processContents =“strict”
  2. ,那么xsd:any的值是什么呢?
  3. EAI / ESB工具/库是否可以针对我返回的任意元素执行XPATH表达式
  4. 我看到各种绑定工具在生成绑定代码时单独处理它。如果我在代码生成时间内包含 namespace =“http:// mynamespace”并提供“http:// mynamespace”的架构,这是否相同?
  5. 这是否符合WS-I标准?
  6. 我有遗失的任何陷阱吗?
  7. 谢谢

2 个答案:

答案 0 :(得分:2)

  1. 使用<xsd:any processContents="strict">,人们可以在不更改原始架构的情况下为其XML实例文档添加扩展。这是它给你带来的重要好处。
  2. 是。工具比操纵实例不关心模式是什么样的,它是他们看到的实例文档。对他们而言,如果您使用<xsd:any>,则无关紧要。
  3. 绑定工具通常不会非常优雅地处理<xsd:any>。这是可以理解的,因为它们没有关于它可能包含什么的信息,所以它们通常会给你一个无类型的占位符。它是在运行时处理它的应用程序代码。 JAXB是特别的(至少RI)只是它的一个拳头,但它是可行的。
  4. 是。这是非常好的XML Schema实践,WS-I
  5. 支持所有有效的XML Schema 由于绑定的无类型性质,
  6. <xsd:any>使程序员的生活变得更加困难,但是如果你需要支持任意扩展点,这就是这样做的方法。但是,如果您的扩展程序定义明确,并且没有更改,则可能不值得激怒因素。

答案 1 :(得分:1)

关于第3点

  

绑定工具通常无法处理    非常优雅。这是   可以理解,因为他们没有   有关它可能的信息   包含,所以他们通常会给你   一个无类型的占位符。它起来了   用于处理该问题的应用程序代码   运行。 JAXB特别(RI,   至少)做了一点点,   但它是可行的。

这对应于JAXB中的@XmlAnyElement注释。行为如下:

@XmlAnyElement - 将所有内容保留为DOM节点

如果使用此批注对属性进行批注,则XML文档的相应部分将保留为DOM节点。

@XMLAnyElement(lax = true) - 将已知元素转换为域对象

通过设置 lax = true ,如果JAXB的根类型对应于该QName,那么它会将该块转换为域对象。