当前位置: 首页 > 知识库问答 >
问题:

使用xjc分析xsd时出错

桂学
2023-03-14

我正在使用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'的有效值。

共有2个答案

赵俊侠
2023-03-14

正如ColdFusion已经观察到的,错误消息“记录的原因: cvc-datatypvalid.1.2.1:‘xsi: schema位置’不是‘NCName’的有效值”对这个问题非常明确。您的XSD模式文档包括声明

<xsd:attribute name="xsi:schemaLocation" 
               type="xsd:string" />

但是name属性的值必须是NCName——不允许使用冒号和名称空间前缀。

然而,ColdFusion建议您需要将xsi命名空间导入到您的模式中是错误的:您不需要这样做,这样做也不会有任何效果,因为xsi命名空间中的属性是由模式验证器专门处理的;它们不会针对声明进行验证来自用于验证的架构。(为它们声明没有特别的伤害,但是这些声明不会被使用。)

马和硕
2023-03-14

嗯,这正是它所说的(我的意思是错误)。字符串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中,我有: