我仍然对XML Schema等有点新意,并且一直致力于开发一些XML,Schema和样式表(XSLT)。我已经取得了合理的进展,但随后意识到我的Schema已停止工作,所以我把它带回了一个更简单的非描述性示例。
这是我的XML:
<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="Test.Namespace"
schemaLocation="http://myNameSpace.com Test1.xsd">
<element1 id="001">
<element2 id="001.1">
<element3 id="001.1" />
</element2>
</element1>
</Root>
我写了一个Schema:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="Test.Namespace"
elementFormDefault="qualified">
<xsd:element name="Root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="element1" maxOccurs="unbounded" type="element1Type"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="element1Type">
<xsd:sequence>
<xsd:element name="element2" maxOccurs="unbounded" type="element2Type"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
<xsd:complexType name="element2Type">
<xsd:sequence>
<xsd:element name="item" type="element3Type"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
<xsd:complexType name="element3Type">
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
Schema代表了我真实XML的结构。
现在,当我尝试验证我的XML时,我收到此错误:
cvc-elt.1: Cannot find the declaration of element 'Root'. [7]
我认为这与Root元素上的命名空间问题有关,但我真的不确定。
请有人建议我做错了。
答案 0 :(得分:20)
感谢上面的所有人,但现在已经修复了。为了其他人的利益,最重要的错误是如Ian所建议的那样对齐三个命名空间。
为了完整性,这里是更正的XML和XSD
这是XML,更正了拼写错误(抱歉由于迟到造成的任何混淆)
<?xml version="1.0" encoding="UTF-8"?>
<Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:Test.Namespace"
xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
>
<element1 id="001">
<element2 id="001.1">
<element3 id="001.1" />
</element2>
</element1>
</Root>
,这是Schema
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:Test.Namespace"
xmlns="urn:Test.Namespace"
elementFormDefault="qualified">
<xsd:element name="Root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="element1" maxOccurs="unbounded" type="element1Type"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="element1Type">
<xsd:sequence>
<xsd:element name="element2" maxOccurs="unbounded" type="element2Type"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
<xsd:complexType name="element2Type">
<xsd:sequence>
<xsd:element name="element3" type="element3Type"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
<xsd:complexType name="element3Type">
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
再次感谢大家,我希望将来对其他人有用。
答案 1 :(得分:16)
cvc-elt.1:找不到元素'Root'的声明。 [7]
根元素上的schemaLocation
属性应为xsi:schemaLocation
,您需要修复它才能使用正确的命名空间。
您应该将架构的targetNamespace
和文档的xmlns
更改为http://myNameSpace.com
(因为名称空间应该是有效的URI,Test.Namespace
不是' t,虽然urn:Test.Namespace
没问题。一旦你这样做,它应该找到架构。关键在于,模式的所有三个目标命名空间,文档的命名空间以及您为其提供模式位置的命名空间必须相同。
(虽然它仍然无法验证,因为您的<element2>
在架构所需的文档中包含<element3>
item
)
答案 2 :(得分:1)
您的XML架构的targetNamespace
与 Root 元素的命名空间不匹配(Test.Namespace
中的点与Test,Namespace
中的逗号)
一旦您达成上述协议,您必须考虑element2
有一个属于订单的属性不在您的XSD中。