XSD验证错误:元素'{http://www.example.com}范围':不期望此元素。预计是(范围)

时间:2012-05-04 08:08:59

标签: xml xsd schema validation xmllint

我创建了以下XSD(使用Eclipse):

  <?xml version="1.0" encoding="UTF-8"?>
  <schema targetNamespace="http://www.example.com" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.com">
    <element name="Make">
      <complexType>
        <sequence>
          <element name="Scope"></element>
        </sequence>
      </complexType>
    </element>
  </schema>

并使用这个简单的XML验证

  <?xml version="1.0"?>
  <Make xmlns="http://www.example.com">
    <Scope>
    </Scope>
  </Make>

给出:

  xmllint.exe --noout --schema sources.xsd sources.xml
  sources.xml:3: element Scope: Schemas validity error : Element '{http://www.example.com}Scope': This element is not expected. Expected is ( Scope ).
  sources.xml fails to validate

在我看来,必须是正确的:XML文件位于命名空间http://www.example.com中(验证者也说了)。

对于XSD,我将默认命名空间设置为XSD架构(这是Eclipse所做的,所以它应该是正确的!)并且我给出了正确的targetNamespace。我也尝试过使用

<element name="tnd:Scope" />

然而,这也不起作用。

这是xmllint中的错误还是问题出在哪里?

此致 DIVB

3 个答案:

答案 0 :(得分:4)

@dbasemans 答案的替代方法是将elementFormDefault指定为合格

 <schema targetNamespace="http://www.example.com"
     xmlns="http://www.w3.org/2001/XMLSchema"
     xmlns:tns="http://www.example.com"
     elementFormDefault="qualified">

使用架构命名空间的xsdxs前缀可能会被视为常见,因此可能需要根据 dbaseman 的建议选择修改架构。

答案 1 :(得分:2)

如果您不想在要验证的XML文件中指定任何限定符,则必须将 targetNamespace 和根XSD名称空间都设置为相同的值。所以它必须是:

<schema targetNamespace="http://www.example.com" xmlns="http://www.example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

但当然,你必须使用xsd:来限定XSD元素。换句话说,要让您的XML文件按原样验证,您需要编写如下模式:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.example.com">
    <xsd:element name="Make">
        <xsd:complexType>
            <xsd:sequence>
               <xsd:element name="Scope"></xsd:element>
            </xsd:sequence>
       </xsd:complexType>
    </xsd:element>
</xsd:schema>

有关详细信息,请参阅此处:http://www.xfront.com/DefaultNamespace.pdf

编辑感谢PetruGardea指出错误。正如Filbert的回答所暗示的那样,默认情况下 elementFormDefault unqualified ,这意味着假定实例文档位于目标命名空间中。所以Filbert的答案是正确的 - 唯一的选择是通过省略 targetNamespace 并将 elementFormDefault 保留为 unqualified 来使整个事件匿名,并且然后完全从实例文档中删除名称空间引用。

以下是 elementFormDefault 的详细信息:http://www.xfront.com/HideVersusExpose.html

答案 2 :(得分:1)

如果您不能或不想更改XSD,我找到了此问题的另一种解决方案。以下XML符合您的XSD:

<?xml version="1.0"?>
<tns:Make xmlns:tns="http://www.example.com">
    <Scope>
    </Scope>
</tns:Make>

如果elementFormDefault设置为非限定,则必须为全局元素定义名称空间,并且不能为本地元素定义名称空间。全局元素是XSD中架构元素正下方的元素,局部元素是嵌套在其他元素中的元素。您的错误是由使用默认命名空间定义本地元素Scope的命名空间引起的。

http://www.oracle.com/technetwork/articles/srivastava-namespaces-092580.html还有进一步的解释。