【问题标题】:XSD Validation of XML: Cannot find the declaration of elementXML 的 XSD 验证:找不到元素的声明
【发布时间】:2013-01-09 14:18:46
【问题描述】:

我一直在搞乱通过 xsd 进行 XML 验证,但我还是新手。我尝试验证这个 xml,它弹出这个错误:cvc-elt.1:找不到元素“客户”的声明。 [5]

<?xml version="1.0"?>

<customers xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://w3schools.com requested_customer.xsd">

 <customer name="Vladimir Putin" address="St. Petersburg, wadim street 23, Russia"/>
</customers>

和 XSD

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <xs:element name="customers">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="customer">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute type="xs:string" name="name"/>
                <xs:attribute type="xs:string" name="address"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

感谢您的帮助!

【问题讨论】:

  • 你能把XSD的内容也发一下吗?
  • 给你!它可能来自 XSD?
  • xsi:schemaLocation="WRONG NAMESPACE requested_customers.xsd" -- 你的架构应该有一个 targetNamespace 属性。此 targetNamespace 的值应该是您在 schemaLocation 值中使用的值。

标签: xml xsd


【解决方案1】:

首先,您的 XML 的内容不使用 XML 命名空间,因此要在没有目标命名空间的情况下引用 XSD 的文件位置,您应该改用 xsi:noNamespaceSchemaLocation 属性。

其次,您必须确保 XSD 文件的位置是已知的,并且可供验证程序访问。

您的 XML/XSD 组合完全有效。

【讨论】:

  • 您好,我被要求使用具有命名空间的 XML 进行课程作业,我需要定义一个。这做起来简单吗?谢谢!!
  • 有关xsi:noNamespaceSchemaLocation的更多信息,另请参阅W3Schools page
  • @user1959493,它可能很容易开始。假设您想将命名空间 urn:tempuri-org 添加到您目前所做的工作中。您需要做的就是 i) 添加 targetNamespace="urn:tempuri-org" xmlns="urn:tempuri-org" 属性到您的 XSD 文件、xs:schema 元素,ii) 添加 xmlns="urn:tempuri-org"属性到您的 customers 元素和 iii) 将 xsi:schemaLocation 属性值中的 http://w3schools.com 替换为 urn:tempuri-org。现在,命名空间可能会令人困惑,鉴于您遇到的错误,我建议您花点时间阅读一些 XML 命名空间文章...
  • @PetruGardea 您提供了很好的答案!我想知道您使用什么工具来检查 xml 和架构的有效性。我创建实际文件并运行命令行工具 - 但剪切并粘贴到网页会更方便。但是所有的在线验证器都非常有限......你知道一个在线 xml 验证器可以正确处理这个问题中的问题吗?例如从schemaLocation 加载,而不是显式指定架构;具有多个模式。谢谢!
  • @13ren,谢谢你的客气话。我正在使用我自己的基于 GUI 的工具来处理您在此处看到的内容;但是,它是基于桌面的。 xsi:*schemaLocation 属性很棘手,它们只是提示,您可以同时拥有两者,并且错误的一个或一个具有错误值的属性通常会被标记为与帖子中相同的错误消息。既然您已经提到,我相信 QTAssistant 还会抱怨,此外,如果指定的位置无法解决,则会出现不同的错误消息。如果您对更多详细信息感兴趣,请通过我的网站与我联系,以将其带出。
【解决方案2】:

另外,如果您的意图是在customers 中允许多个customer,您需要进行更改:

  <xs:element name="customer">

收件人:

  <xs:element name="customer" maxOccurs="unbounded">

当然,maxOccurs 也可以是有限值,例如100maxOccurs(和minOccurs)都默认为1See)。 minOccurs也可以是0

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多