<xs:any>和匹配的通配符错误</xs:any>

时间:2013-06-17 19:20:55

标签: xml eclipse xsd xml-validation

目标:创建一个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'“

1 个答案:

答案 0 :(得分:6)

如果您显示的架构文档产生了您引用的错误消息,那将是令人惊讶的;我希望您的第一个问题是您的架构文档(您说)名为skip.xsd,但相关xs上的schemaLocation属性包括指向http://example.com/skip的点,而您的第二个问题是您的跳过类型在名称空间http://www.example.com/main中,但skip元素的声明引用名称空间http://escmatrix.com/main中的类型。但我想这些只是在减少问题的示例代码时出现的文书错误。

错误消息非常清楚:您的通配符被解释为严格通配符,因此与其匹配的元素应具有声明,如果不符合,则文档无效。您的通配符是严格的,因为您没有为其指定processContents属性,默认值processContentsstrict。如果要允许未声明的元素,则需要指定processContents="lax"processContents="skip" - 如果存在声明的元素应根据这些声明进行验证,则使用宽松通配符,如果要使用跳过通配符,则使用跳过通配符您根本不希望对它们进行验证,在这种情况下,skip元素只要其子元素形成良好就会有效。你说你想要一个“无错误地验证我的xml”的模式,我猜你的意思是“在所有情况下都接受我的XML有效”(处理器已经正确并且成功地检查输入的有效性而没有失败,所以它是已经验证了你的XML而没有错误),所以它看起来好像你想要一个跳过通配符。