XML Schema验证:找不到根元素的声明

时间:2014-09-08 19:15:36

标签: xml xsd schema

我对XML非常新鲜,即使我管理得很好,我现在仍然处于关于XML Schema这种棘手的情况。您可以在下面看到我的XML文档代码及其各自的Schema代码。首先是我的XML文档代码。

<?xml version="1.0" encoding="UTF-8"?>
<Cars
  xmlns="http://www.verkkokauppa.com"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema"
  xsi:schemaLocation="http://www.verkkokauppa.com 4Schema.xsd">

<Car>
    <Brand>BMW</Brand>
    <Model>535d</Model>
    <Gear>Automatic</Gear>
    <Year>2007</Year>
    <Info>It's a german.</Info>
</Car>
</Cars>

下面你可以看到我代表的架构代码

<?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.verkkokauppa.com"
    xmlns="http://www.verkkokauppa.com" 
    elementFormDefault = "qualified">
  <xsd:element name = "Brand" type = "xsd:string"/>
  <xsd:element name = "Model" type = "xsd:string"/>
  <xsd:element name = "Gear" type = "xsd:string"/>
  <xsd:element name = "Year" type = "xsd:int"/>
  <xsd:element name = "Information" type = "xsd:string"/>
  <xsd:complexType name = "CarType">
      <xsd:sequence>
          <xsd:element ref = "Brand"/>
          <xsd:element ref = "Model"/>
          <xsd:element ref = "Gear"/>
          <xsd:element ref = "Year"/>
          <xsd:element ref = "Information" 
            minOccurs = "0" maxOccurs = "1" /> 
      </xsd:sequence>
  </xsd:complexType>
  <xsd:element name = "Cars">
      <xsd:complexType>
          <xsd:sequence>
              <xsd:element name = "Car" type = "CarType" 
               maxOccurs = "unbounded"/>
          </xsd:sequence>
      </xsd:complexType>
  </xsd:element>
</xsd:schema>    

现在,每当我尝试验证XML文档代码时,都会收到错误消息: “cvc-elt.1:找不到元素'汽车'的声明。[6]”

我认为这是关于Cars元素的命名空间问题,这是我的根元素,但我真的不确定。

如果有人能指导我,我会非常感激。

2 个答案:

答案 0 :(得分:1)

你的猜测很好,因为匹配命名空间的失败是这类错误消息的常见原因。但是您的根元素在名称空间Cars中具有本地名称http://www.verkkokauppa.com,并且名称空间http://www.verkkokauppa.com的模式文档声明了一个本地名称为Cars的元素。所以我不认为它是命名空间问题。也许我在这里遗漏了一些微妙的东西。

如果它不是命名空间匹配问题,最可能的原因是您的架构验证程序未找到架构文档。

在这种情况下要问的一般性问题是:您使用的验证器是什么?你是怎么调用它的?你怎么相信你告诉它在哪里找到应该使用的架构文件?

如果您依赖于根元素上的xsi:schemaLocation属性,那么您是否检查过您的架构文档与文件名4Schema.xsd下的输入XML存在于同一目录中?您是否检查过验证器是否接受架构位置提示? (这是一个提示,而不是一条指令。)您还应该检查以确保您的xsi:schemaLocation属性正确。

在这种特定情况下,您有一个xsi:schemaLocation属性,这是常规属性,但您已将前缀xsi绑定到命名空间http://www.w3.org/2001/XMLSchema,而不是命名空间http://www.w3.org/2001/XMLSchema-instance。没有XSD验证器会对名为{http://www.w3.org/2001/XMLSchema}schemaLocation的属性执行任何操作 - 如果他们根本寻找文档内架构信息,他们会查找{http://www.w3.org/2001/XMLSchema-instance}schemaLocation

答案 1 :(得分:0)

您需要了解XML验证的基础知识。是的,你最初的猜测是正确的,这是与namaspace相关的问题。除了那个XML文档结构是错误的。您已将Information元素定义到XSD中,但是您已在XML中定义了info元素。如果您是初学者,请通过此tutorial来了解XML命名空间。希望下面的修改代码可以帮助你。

查找以下修改后的代码

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://www.verkkokauppa.com" 
  xmlns="http://www.verkkokauppa.com" 
  elementFormDefault="qualified">
<xsd:element name = "Brand" type = "xsd:string"/>
<xsd:element name = "Model" type = "xsd:string"/>
<xsd:element name = "Gear" type = "xsd:string"/>
<xsd:element name = "Year" type = "xsd:int"/>
<xsd:element name = "Information" type = "xsd:string"/>
<xsd:complexType name = "CarType">
  <xsd:sequence>
      <xsd:element ref = "Brand"/>
      <xsd:element ref = "Model"/>
      <xsd:element ref = "Gear"/>
      <xsd:element ref = "Year"/>
      <xsd:element ref = "Information" minOccurs = "0" 
        maxOccurs = "1" /> 
  </xsd:sequence>
</xsd:complexType>
<xsd:element name = "Cars">
  <xsd:complexType>
      <xsd:sequence>
          <xsd:element name = "Car" type="CarType" 
            maxOccurs = "unbounded"/>
      </xsd:sequence>
  </xsd:complexType>
</xsd:element>
</xsd:schema>    

XML:

<?xml version="1.0" encoding="UTF-8"?>
<Cars xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.verkkokauppa.com">
 <Car>
  <Brand>BMW</Brand>
  <Model>535d</Model>
  <Gear>Automatic</Gear>
  <Year>2007</Year>
  <Information>It's a german.</Information>
 </Car>
</Cars>