使用xjc解析xsd时出错



我使用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名称空间中的属性是由模式验证器专门处理的;它们不会根据用于验证的模式的声明进行验证。(为它们声明没有特别的害处,但是这些声明不会被使用。)

最新更新