0

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

4

2 回答 2

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


我已经对此进行了更多研究....并且它更深入。这里还有一个与你的问题相关的问题: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 模式的现代软件通常保存此类内容的本地副本。)

于 2013-06-06T12:33:58.540 回答
0

正如 ColdFusion 已经观察到的,错误消息“记录的原因:cvc-datatypevalid.1.2.1:'xsi:schemaLocation' 不是 'NCName' 的有效值”非常明确地说明了这个问题。您的 XSD 架构文档包含声明

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

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

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

于 2013-06-20T22:20:49.297 回答