允许任何内容的XML Schema(xsd:any)

时间:2014-09-23 20:15:53

标签: xml xsd

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

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

我尝试使用当前架构,并仅保留xs:schema标记以创建空架构,但这显然不起作用。

3 个答案:

答案 0 :(得分:14)

无论文档的内容如何,​​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]

<?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.

答案 1 :(得分:3)

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

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

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

警告:我在这里大大简化了规则。

答案 2 :(得分:0)

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

如上所述:

  

遵循XML标准的XML被认为是良好的形式,而遵守DTD [或架构]的XML被认为是有效的。

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

了解如何在不强制后者(验证)的情况下完成前者(检查格式良好)。