【问题标题】:XML Schema that allows anything (xsd:any)允许任何东西的 XML 模式 (xsd:any)
【发布时间】:2014-09-23 20:15:53
【问题描述】:

我需要一个 XML 模式示例,它允许任何事情。

这样听起来可能很奇怪,但我需要它来调试我当前的架构。问题是我有一个复杂的对象,我在一个函数(我无法控制的 DLL 的一部分)中使用它以及一个模式,并且该函数返回给我 XML。目前,该函数会引发异常,因为在验证模式时出现错误,但不应该出现错误。所以,我想要一个空白的架构,一个不会导致任何验证错误的架构,这样我就可以看到函数输出的 XML。

我尝试使用我当前的架构,只保留 xs:schema 标记来创建一个空架构,但这显然不起作用。

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    XML Schema 无法指定文档无论其内容如何都是有效的。

    但是,如果您能够指定根元素,则可以使用 xs:anyAttributexs:any 来允许根元素上的任何属性以及根下的任何 XML:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="root">
        <xs:complexType>
          <xs:sequence>
            <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
          <xs:anyAttribute processContents="skip"/>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    

    在您的情况下,只要您可以确定可能的根元素名称数量有限,您就可以使用此技术来允许具有已知名称的根元素下的任何 XML 内容。


    更新:这可以写得更简洁[Credit: C. M. Sperberg-McQueen]: p>

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="root"/>
    </xs:schema>
    

    请注意,这是允许的,but not requiring, root to be empty.

    【讨论】:

    • &lt;xs:element name="root"/&gt; 声明root 在大多数正常情况下会产生相同的效果,而且会更短。
    【解决方案2】:

    通常假设 XML 模式将文档划分为有效的和无效的。它实际上比这更微妙。当您调用验证时,您需要说明您希望如何完成验证。最常见的调用是严格验证,在这种情况下,实例文档中的根元素的名称必须与架构中的全局元素声明的名称相对应,或者它必须具有与全局类型匹配的 xsi:type 属性架构中的定义。因此,在严格验证下,没有有限的模式会匹配每个文档实例。

    原则上,您还可以调用模式处理器来进行宽松的验证。在这种情况下,如果架构中的全局元素声明中的根元素名称不匹配,则验证成功。因此,空模式(无声明)匹配宽松验证下的每个实例文档。

    您还可以针对命名类型调用验证。如果您针对命名类型 xs:anyType 调用验证,那么每个实例都是有效的,而不管架构说什么。

    警告:我已经大大简化了这里的规则。

    【讨论】:

    • 说了这么多,对你的用例的实际答案是:如果你想把你的 XML 视为有效,不管它包含什么,然后跳过验证步骤。
    • 但问题是我无法控制 XML 和 scema 的使用方式。我所能做的就是将对象和模式传递给外部 DLL 的函数部分。
    • 那么也许最好的解决方案是阅读文档,发现根元素名称,并生成一个模式,用 type="xs:anyType" 声明这个根元素名称。
    【解决方案3】:

    您不需要也不想要架构。 XML documents can be classified as "well-formed" and "valid".

    如上述答案所述:

    遵循 XML 标准的 XML 被认为是格式良好的,而遵循 DTD [或模式] 的 XML 被认为是有效的。

    我应该指出,所有有效的 XML 文档也是格式良好的。但是在您的情况下,您并不关心 XML 文档的“有效性”,只关心它的格式是否正确。所有 XML 解析器都可以(确实必须)检查格式是否正确,并且进行模式验证通常需要额外的步骤。

    研究如何在不强制后者(验证)的情况下执行前者(检查格式是否正确)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2019-11-14
      • 1970-01-01
      • 2019-12-11
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多