我正在使用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-datatypevalid.1.2.1:'xsi:schemaLocation'不是 'NCName'的有效值。
答案 0 :(得分:2)
嗯,这正是它所说的(错误,我的意思)。
字符串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的所有内容...... 我推荐这本O'Reilly书: XML Schema: The W3C's Object-Oriented Descriptions for XML
我已经对此进行了一些调查......而且它更深入。此处还有一个与您的问题相关的问题:what is the use of 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模式的现代软件通常都会保存这些东西的本地副本。)
答案 1 :(得分:0)
正如ColdFusion已经观察到的那样,错误消息“Recorded reason:cvc-datatypevalid.1.2.1:'xsi:schemaLocation'不是'NCName'的有效值”,这个问题非常明确。您的XSD架构文档包含声明
<xsd:attribute name="xsi:schemaLocation"
type="xsd:string" />
但name
属性的值必须是NCName - 不允许使用冒号和名称空间前缀。