目标:创建一个complexType,允许元素“skip”以任意顺序包含任意元素,并且无误地验证我的xml。
架构:skip.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns="http://www.example.com/main"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/main"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
>
<xs:complexType name="skip">
<xs:sequence>
<xs:any minOccurs="1"
maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:schema>
我将skip.xsd导入到我的main.xsd
中<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:esc="http://www.escmatrix.com/main"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.com/main"
attributeFormDefault="unqualified"
elementFormDefault="qualified"
>
<xs:include
schemaLocation="http://www.example/skip" />
<xs:element name="tasks">
<xs:complexType>
<xs:choice minOccurs="0"
maxOccurs="unbounded" >
<xs:element name="skip"
type="esc:skip" />
</xs:choice>
</xs:complexType>
</xs:element>
<xs:schema>
我需要验证可以具有以下形式的xml:
<skip>
<anyelement1></anyelement1>
<anyelement2></anyelement2>
<anyelementN></anyelementN>
</skip>
问题:验证时出错; “cvc-complex-type.2.4.c:匹配的通配符是严格的,但是找不到声明 元素'anyelement1'“
答案 0 :(得分:6)
如果您显示的架构文档产生了您引用的错误消息,那将是令人惊讶的;我希望您的第一个问题是您的架构文档(您说)名为skip.xsd,但相关xs上的schemaLocation属性包括指向http://example.com/skip的点,而您的第二个问题是您的跳过类型在名称空间http://www.example.com/main中,但skip元素的声明引用名称空间http://escmatrix.com/main中的类型。但我想这些只是在减少问题的示例代码时出现的文书错误。
错误消息非常清楚:您的通配符被解释为严格通配符,因此与其匹配的元素应具有声明,如果不符合,则文档无效。您的通配符是严格的,因为您没有为其指定processContents
属性,默认值processContents
为strict
。如果要允许未声明的元素,则需要指定processContents="lax"
或processContents="skip"
- 如果存在声明的元素应根据这些声明进行验证,则使用宽松通配符,如果要使用跳过通配符,则使用跳过通配符您根本不希望对它们进行验证,在这种情况下,skip
元素只要其子元素形成良好就会有效。你说你想要一个“无错误地验证我的xml”的模式,我猜你的意思是“在所有情况下都接受我的XML有效”(处理器已经正确并且成功地检查输入的有效性而没有失败,所以它是已经验证了你的XML而没有错误),所以它看起来好像你想要一个跳过通配符。