我使用xjc解析xsd
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Response">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Content">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Content1">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Type" type="xsd:string" />
<xsd:element name="ID" type="xsd:string" />
<xsd:element name="CreationDate" type="xsd:dateTime" />
<xsd:element name="LastModified" type="xsd:dateTime" />
<xsd:element name="PublicationDate">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Start" type="xsd:dateTime" />
<xsd:element name="End" type="xsd:dateTime" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Content2">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Type" type="xsd:string" />
<xsd:element name="Lang" type="xsd:string" />
<xsd:element name="Subject" type="xsd:string" />
<xsd:element name="TextContent" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="xsi:schemaLocation" type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
我得到错误:记录的原因:cvc- datatypevalidate .1.2.1: 'xsi:schemaLocation'不是
嗯,这就是它所说的(我的意思是错误)。字符串xsi:schemaLocation
不能为属性名。但是你已经指定了,所以在这行中:
<xsd:attribute name="xsi:schemaLocation" type="xsd:string" />
这是因为,根据XML, xsi:
应该是一个名称空间前缀,因此,它实际上是XML标记的一部分,因此不能是任何纯XML名称(元素或属性)的一部分。
如果你删除那一行的xsi:
,像这样:
<xsd:attribute name="schemaLocation" type="xsd:string" />
将被解析,没有问题。但是,问题仍然存在:xsi:
前缀是什么意思?你在哪里买的?也许以后在整个XML模式项目的某个地方需要它?
所以,我认为你应该更好地理解所有XML/XSD的东西…我推荐奥莱利的这本书:XML Schema: W3C对XML的面向对象描述
我已经研究了这一点....它会更深入。这里还有一个与您的问题相关的问题:xsi:schemaLocation的用途是什么?
xsi:schemaLocation
是w3c预定义命名空间中的全局属性:http://www.w3.org/2001/XMLSchema-instance
所以,如果你想使用那个属性,你需要首先导入那个命名空间,然后,在模式中定义对xsi:schemaLocation
的引用。它看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsd:import namespace="http://www.w3.org/2001/XMLSchema-instance"/>
<xsd:element name="Response">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Content">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Content1">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Type" type="xsd:string" />
<xsd:element name="ID" type="xsd:string" />
<xsd:element name="CreationDate" type="xsd:dateTime" />
<xsd:element name="LastModified" type="xsd:dateTime" />
<xsd:element name="PublicationDate">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Start" type="xsd:dateTime" />
<xsd:element name="End" type="xsd:dateTime" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Content2">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Type" type="xsd:string" />
<xsd:element name="Lang" type="xsd:string" />
<xsd:element name="Subject" type="xsd:string" />
<xsd:element name="TextContent" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute ref="xsi:schemaLocation"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
注意变化:
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
在<xsd:schema>
标签中添加,将xsi
前缀与该命名空间绑定。 - 名称空间定义(即定义它的模式)是通过元素
<xsd:import namespace="http://www.w3.org/2001/XMLSchema-instance"/>
导入的 - 旧的本地属性声明
<xsd:attribute name="xsi:schemaLocation" type="xsd:string"/>
被替换为全局属性引用:<xsd:attribute ref="xsi:schemaLocation"/>
现在,它应该工作了。
但是要确保您的XML模式解析器(那个'xjc')知道从哪里得到http://www.w3.org/2001/XMLSchema-instance
名称空间的XML模式。很有可能是这样。实际上,该模式是由名称空间URI中表示的URL精确定位的,因此可以从那里自动下载。(然而,许多使用XML模式的现代软件通常会保存这些内容的本地副本。)
ColdFusion已经观察到,错误消息"记录的原因:cvc- datatypevalidate .1.2.1: 'xsi:schemaLocation'不是'NCName'的有效值"是相当明确的问题。您的XSD模式文档包括声明
<xsd:attribute name="xsi:schemaLocation"
type="xsd:string" />
但是name
属性的值必须是NCName——冒号和命名空间前缀是不允许的。
ColdFusion建议您需要将xsi名称空间导入到模式中是错误的:您不需要这样做,这样做也不会产生任何影响,因为xsi名称空间中的属性是由模式验证器专门处理的;它们不会根据用于验证的模式的声明进行验证。(为它们声明没有特别的害处,但是这些声明不会被使用。)