使用xjc解析xsd时出错

时间:2013-06-06 10:42:29

标签: xsd xsd-validation xjc

我正在使用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 个答案:

答案 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>

注意发生了什么变化:

    {li> 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 - 不允许使用冒号和名称空间前缀。

但是,ColdFusion建议您需要将xsi名称空间导入到模式中是错误的:您不需要这样做,并且这样做无效,因为xsi名称空间中的属性是由模式验证器专门处理的;它们未针对用于验证的模式的声明进行验证。 (对它们进行声明没有特别的伤害,但不会使用这些声明。)