【问题标题】:XSD validation error: Element '{http://www.example.com}Scope': This element is not expected. Expected is ( Scope )XSD 验证错误:元素“{http://www.example.com}Scope”:不需要此元素。预期是(范围)
【发布时间】:2012-05-13 18:36:28
【问题描述】:

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

【问题讨论】:

  • 错字? tnd:Scope应该是tns:Scope

标签: xml xsd schema validation xmllint


【解决方案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有进一步的解释。

【讨论】:

    【解决方案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 的回答所暗示的那样,默认情况下,elementFormDefaultunqualified,这意味着假定实例文档位于目标命名空间中。所以菲尔伯特的回答是正确的——唯一的选择是通过省略 targetNamespace 并将 elementFormDefault 保留为 unqualified 来使整个事情匿名,并且然后从实例文档中完全删除命名空间引用。

    以下是 elementFormDefault 功能的详细说明:http://www.xfront.com/HideVersusExpose.html

    【讨论】:

    • 很遗憾,您的回答与问题无关; XSD 没有问题,您所提议的不是以任何方式更改架构;您更新的 XSD 不会改变验证提议的 XML 的结果。
    【解决方案3】:

    @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 的建议修改您的架构。

    【讨论】:

    • 嗨,谢谢(对你们俩)!那时我不明白的一件事:那我需要 targetNamespace 做什么?
    • 实际上,您的答案是正确的 (+1) 而另一个是错误的。然而,许多人会争辩说xsd 可以被视为标准前缀——我会使用“common”来代替。事实上,xs 是在 DTD 中定义的,它通常伴随 XSD 的 XSD...
    • @divB 你仍然需要 targetNamespace 除非你想在实例文档中隐藏(本地化)example.com 命名空间。
    • "xsd:" 是 Microsoft,而 "xs:" 是 XML Schema 规范中使用的一个,因此 "xsd:" 绝对不是标准(尽管有些人认为 Microsoft = Standard)。
    猜你喜欢
    • 2015-07-07
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多