3

到目前为止,我一直在通过定义具有“名称”和“值”属性的占位符元素来处理扩展,如下例所示

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

我现在打算改用xsd:any。如果您能帮助我选择最佳方法,我将不胜感激

  1. 如果我指定 processContents="strict",xsd:any 比我以前的方法有什么附加值
  2. EAI/ESB 工具/库能否针对我返回的任意元素执行 XPATH 表达式
  3. 我看到各种绑定工具在生成绑定代码时分别处理这个问题。如果我包含一个命名空间=“http://mynamespace”并在代码生成期间为“http://mynamespace”提供架构,情况是否相同?
  4. 这是否符合 WS-I?
  5. 有什么我遗漏的问题吗?

谢谢

4

2 回答 2

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

关于第 3 点

绑定工具通常不能很好地处理。这是可以理解的,因为他们没有关于它可以包含什么的信息,所以他们通常会给你一个无类型的占位符。由应用程序代码在运行时处理它。JAXB 是特殊的(至少是 RI)对它有点拳头,但它是可行的。

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

@XmlAnyElement - 全部保留为 DOM 节点

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

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

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

于 2011-02-03T21:36:42.150 回答