我正在使用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'的有效值。
正如ColdFusion已经观察到的,错误消息“记录的原因: cvc-datatypvalid.1.2.1:‘xsi: schema位置’不是‘NCName’的有效值”对这个问题非常明确。您的XSD模式文档包括声明
<xsd:attribute name="xsi:schemaLocation"
type="xsd:string" />
但是name
属性的值必须是NCName——不允许使用冒号和名称空间前缀。
然而,ColdFusion建议您需要将xsi命名空间导入到您的模式中是错误的:您不需要这样做,这样做也不会有任何效果,因为xsi命名空间中的属性是由模式验证器专门处理的;它们不会针对声明进行验证来自用于验证的架构。(为它们声明没有特别的伤害,但是这些声明不会被使用。)
嗯,这正是它所说的(我的意思是错误)。字符串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模式:W3C的面向对象的XML描述
我对此做了更多的调查......而且越来越深。这里还有一个与你的问题相关的问题:xsi: schema位置有什么用?
在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"
被添加到
现在,它应该起作用了。
但是要确保您的XML模式解析器(即xjc)知道从哪里获取
http://www.w3.org/2001/XMLSchema-instance
命名空间的XML模式。最有可能的是。实际上,该模式正好位于命名空间URI中表示的URL中,因此可以从那里自动下载。(然而,许多使用XML模式的现代软件通常持有这些东西的本地副本。)
当xjc解析followinf xsd时,我得到了“Prolog中的错误” 我已经检查了xsd的有效性,没有发现任何错误。开始前没有字符也。。。
我一直在尝试解析xsd文件,以便能够在本地生成jaxb文件。为了做到这一点,我在linux上使用了命令,而不使用命令本身的任何选项。 但即使是我也非常基本地使用它: 它给出了一个错误,如下所示: 错误发生定义见下文第11行。 即使我一直在使用的xsd模式也是一个非常通用和正式的模式,它会给出上面看到的错误。因为它是默认模式,不应该被改变,我不知道我需要做什么... 在一些轮胎之后,我还尝试使用中的
我有一个XSD的格式: 当使用XJC编译器在第1行“prolog中不允许内容”进行编译时,它给出了一个错误。如果我将编码更改为“ISO-8859-1” 它给出了以下错误: 如果我从XSD中删除“root”标记,它将开始出现以下错误: 未能分析架构。 我的问题是,我们是否可以使用XJC编译一个包含多个模式标记的XSD。我尝试了以下文件格式: 它对上面的工作非常好,适当地创建了类。 它与命名空间声明有
我正在一个大型企业平台上集成,供应商喜欢频繁更新其XML格式,尽管他们promise更改将继续向后兼容。我有一个可以工作的XSD…现在…但我想用我们的应用程序代码部署该模式,而不必为每个web服务更新重新部署。作为另一个推动力,(基于JVM的)配置语言具有非常好的XSD类型导入。 作为一种后备方法,我可以使用XPath查询提取特定元素,但这就不那么令人愉快了。 如何继续针对已过时但未过时的架构文件
我的ThymileAF模板中有一个AngularJS属性,看起来像这样: 当Thymeleaf尝试处理此模板时,我得到以下异常: Thymeleaf只是不能很好地处理
B/src/main/gen pom.xml 我想在B项目中从XSD生成类,它存在于一个项目中 在B项目的pom.xml中,我有: