【问题标题】:How can I write an XSD which doesn't care what the root element is called?如何编写一个不关心根元素叫什么的 XSD?
【发布时间】:2013-08-16 10:22:45
【问题描述】:

我的 XML 文件对子元素有限制,但根元素的名称实际上并不重要。如何将其合并到我的 XSD 中?我试过使用<xs:any>,但我得到了:

“S4s-elt-invalid-content.1: 'schema' 的内容无效。元素 'any' 无效、错位或过于频繁地出现。”

所以我尝试从元素标签中删除名称,如下所示:<xs:element> 但后来我得到:

“S4s-att-must-appear:属性‘name’必须出现在元素‘element’中。”

【问题讨论】:

    标签: xsd


    【解决方案1】:

    使用命名类型,并告诉您的验证器使用该类型从根元素开始验证。

    (这有一个可能的问题:XSD 1.0 建议将其作为一种可能的调用选项,但不需要验证器提供它,因此无法保证您使用的验证器接口将支持它。取决于您的验证器。值得至少在尝试。)

    另一种说法:您已经拥有了您想要的东西,因为您的 XSD 架构 从不 关心文档实例的根元素的名称。 XSD 模式提供了一组元素和类型声明(除其他外)。可以请求验证器在文档中的任何位置开始验证,而不仅仅是根,并且可以使用元素声明或类型声明,或者以“宽松通配符模式”(最常见的默认值)。如果您的验证器没有提供您想要的调用选项,那是您选择的验证器存在缺陷,而不是 XSD 中的缺陷。

    【讨论】:

    • 我不确定我们对验证器有多少控制权,因此感谢您的建议,但可能不是满足我们要求的好选择。
    • 您正在调用验证器,但您无法控制验证器的调用方式?我想知道你是怎么陷入这种境地的。
    【解决方案2】:

    我想我可能只是让要求更严格,并坚持使用特定标签作为根元素。应用程序不关心这一事实并不是真正的问题。

    这个限制的存在似乎(对我来说)很奇怪,但我是 XSD 的新手。

    【讨论】:

    • 你的“限制”是什么意思?
    • 必须指定根属性名称的限制。
    • 我认为你的意思是根元素。如果是这样,那么你似乎是在误解下工作。您不仅不必在 XSD 模式中指定根元素的名称,而且不能指定根元素的名称:XSD 没有用于约束文档根元素名称的构造。这是许多人抱怨的 XSD 的设计特征。正如已经解释过的,XSD 的命名类型为您描述的场景提供了直接支持。 “限制”是您的想象。
    • 感谢您的进一步澄清,我现在明白您的解释了。但是,我不确定将用于验证什么,因此我正在寻找一种解决方案,它在文档顶部开始验证(这可能是默认设置),并且不指定第一个元素的名称。这是不可能的事实是限制。但是,我在上面给出了解决方法。
    • 你真的需要开始阅读人们对你问题的回答。验证从哪里开始,它是从元素声明还是类型定义开始,还是从搜索适当的元素声明开始(正如这里已经解释过的)由验证器的 API 或 UI 决定,而不是由 XSD(不在指定 API 或 UI 的业务)。您已经被告知如何实现您的方案;如果您真的坚持不实现它,那么限制很明显是您的,而不是 XSD 的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多