我对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元素的命名空间问题,这是我的根元素,但我真的不确定。
如果有人能指导我,我会非常感激。
答案 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>