我需要一个XML模式的例子,它将允许任何事情。
这可能听起来很奇怪,但我需要调试我当前的架构。问题是我有一个复杂的对象,我在一个函数(我无法控制的DLL的一部分)和一个模式中使用,并且该函数返回XML。现在,该函数抛出异常,因为在使用模式进行验证时出现错误,但不应该有一个。所以,我想要一个空白模式,一个不会导致任何验证错误的模式,所以我可以看到该函数输出的XML。
我尝试使用当前架构,并仅保留xs:schema标记以创建空架构,但这显然不起作用。
答案 0 :(得分:14)
无论文档的内容如何,XML Schema都无法指定文档是否有效。
但是,如果您能够指定根元素,则可以使用xs:anyAttribute
和xs: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解析器都可以(实际上必须)检查格式良好,并且进行模式验证通常需要额外的步骤。
了解如何在不强制后者(验证)的情况下完成前者(检查格式良好)。