【问题标题】:work around for validating XML child elements解决验证 XML 子元素的方法
【发布时间】:2014-06-19 17:47:44
【问题描述】:

基本上我的问题是是否有办法根据给定的 XSD 架构验证非根元素。

我目前正在处理一些遗留代码,其中我们有一些以字符串格式生成 XML 元素的 C++ 类。

我正在考虑一种通过验证生成的 XML 来对这些类进行单元测试的方法(我在后台使用 Xerces C++)。问题是我无法从不同于根的另一个架构中引用元素。

这是对我正在做的事情的更详细描述:

我有一个名为 BooGenerator 的类,它生成在“foo.xsd”中定义的“booIsNotRoot”元素。请注意,'boo' 不是根元素 :-)

我创建了一个 test.xsd 架构,它通过以下方式引用“booIsNotRoot”:

选择>

然后我将 BooGenerator 生成的字符串用一个测试元素包装起来:

(由 BooGenerator 生成的代码以 'foo' 为前缀) 测试>

但正如我之前所说,它不起作用。如果我在 foo.xsd 中引用根元素,它就可以工作。所以我想知道是否有办法解决这个问题。

提前致谢。

【问题讨论】:

    标签: xml xsd xsd-validation xerces xerces-c


    【解决方案1】:
    Basically my question is whether or not there is way to validate a non-root 
    element according to a given XSD schema.
    

    从理论上讲,是的,XSD 建议的Section 5.2 Assessing Schema-Validity 允许进行非根元素有效性评估。 (感谢C. M. Sperberg-McQueen pointing this out。)

    实际上,不,不直接。 XML Schema 工具倾向于针对 XML 文档进行验证——未选择的单个元素——并且 XML 文档必须具有单个根元素。也许您可以将您希望验证的元素嵌入到模拟元素的祖先到文档的正确根元素的操纵上下文中。

    如果我在 foo.xsd 中引用根元素,它就可以工作。

    实际上,foo.xsd 中的根元素最好是xsd:schema。你可能是想说

    如果我在 foo.xsd 中引用 全局定义(在 xsd:schema 下) 的元素,它会起作用。

    这也是@ref 被定义为在 XML Schema 中工作的方式——它不能引用本地定义的元素,例如 foo:booIsNotRoot。此外,any 全局定义的元素可以作为根元素。 (事实上​​,只有全局定义的元素可以作为根元素。)

    因此,您的选择包括:

    1. 装配一个有效的上下文来测试您的目标元素。
    2. 在其 XSD 中全局定义您的目标元素。
    3. 为您的 XSD 验证器确定一个特定于实现的接口,该接口 提供元素级验证。

    【讨论】:

      【解决方案2】:

      是的,完全有可能。 XSD 验证被定义为从 XML 文档中的某个节点开始并对其进行验证(这通常需要验证其所有后代),因此针对指定元素声明或类型定义验证特定元素的请求是完全一致的。

      如何将这样的请求传递给 XSD 验证器是特定于实现的(并且 XSD 没有规定特定的 API 或命令行接口,因此符合要求的 XSD 验证器没有义务支持启动XSD 规范第 5.2 节中定义的验证集);您将不得不查阅实现的文档。我相信支持这种验证的最常见方法是使用适当的 XML 元素、模式和类型定义或元素声明对象调用实现的 XSD 库中的方法。我没有看到任何 XSD 验证器的命令行界面支持在根目录以外的其他地方启动验证。

      【讨论】:

      • +1 指出规范实际上允许元素级验证。谢谢。
      猜你喜欢
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多