8

我创建了以下 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

4

3 回答 3

4

@dbasemans答案的替代方法是指定elementFormDefaultas合格

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

为您的架构命名空间使用xsdorxs前缀可能被认为是常见的,因此可能希望选择按照dbaseman的建议修改您的架构。

于 2012-05-04T08:26:45.247 回答
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 指出错误。正如菲尔伯特的回答所暗示的那样,elementFormDefault默认情况下是不合格的,这意味着假定实例文档位于目标命名空间中。所以菲尔伯特的回答是正确的——唯一的选择是使整个事情匿名,通过省略targetNamespace并将elementFormDefault保留为unqualified,然后从实例文档中完全删除命名空间引用。

这是elementFormDefault所做的一个很好的细分: http ://www.xfront.com/HideVersusExpose.html

于 2012-05-04T08:21:15.543 回答
1

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

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

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

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

于 2016-03-21T10:25:42.957 回答