1

当使用 Xerces 和给定的 XSD 解析一些外部 XML 文件时,我收到一个错误,即未声明标记。

标签声明如下:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://alicebot.org/2001/AIML-1.0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sch="http://www.ascc.net/xml/schematron"
    targetNamespace="http://alicebot.org/2001/AIML-1.0.1" elementFormDefault="qualified"
    attributeFormDefault="unqualified" version="1.0" xml:lang="EN">
    <xs:element name="aiml">
        <xs:annotation>
            <xs:documentation>An AIML object is represented by an aiml element in an XML document.</xs:documentation>
            <xs:appinfo>
                <sch:title>Schematron validation</sch:title>
                <sch:ns prefix="aiml" uri="http://alicebot.org/2001/AIML-1.0.1"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="1" maxOccurs="unbounded">
                <xs:element name="topic">
                    <xs:complexType>
                        <xs:sequence maxOccurs="unbounded">
                            <xs:element name="category" type="Category"/>
                        </xs:sequence>
                        <xs:attribute name="name" type="SimplePatternExpression" use="required"/>
                    </xs:complexType>
                </xs:element>
                <xs:element name="category" type="Category"/>
            </xs:choice>
            <xs:attribute name="version" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="1.0.1"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

通过此方案的代码是

<?xml version="1.0" encoding="ISO-8859-1"?>
<aiml version="1.0.1" xmlns="http://alicebot.org/2001/AIML-1.0.1"
    xmlns:html="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://alicebot.org/2001/AIML-1.0.1 ../../resources/schema/AIML.xsd">
    <category>
    ...

虽然没有通过的代码是

<?xml version="1.0" encoding="UTF-8"?>
<aiml version="1.0">
<category>
...

后者看起来更简单,但不是通过。

如果我将枚举更改为

<xs:attribute name="version" use="required">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="1.0.1"/>
                                                <xs:enumeration value="1.0"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:attribute>

它仍然没有通过。

如何快速修复 XSD?

为什么 Xerces 没有给出精确的错误,而只是表现得盲目?

4

2 回答 2

1

您的架构包含命名空间http://alicebot.org/2001/AIML-1.0.1中元素的定义;当您提供一个包含没有命名空间中的元素的实例文档时,模式处理器将找不到匹配的定义。重要的是要知道命名空间是元素名称的固有部分。当您了解这一点时,也许您会意识到 Xerces 的信息是绝对正确的。

于 2013-10-30T20:43:29.487 回答
1

作为参考,这里是您的 XSD,其类型为category并被SimplePatternExpression删除以完成:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://alicebot.org/2001/AIML-1.0.1"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:sch="http://www.ascc.net/xml/schematron"
           targetNamespace="http://alicebot.org/2001/AIML-1.0.1"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           version="1.0"
           xml:lang="EN">
  <xs:element name="aiml">
    <xs:annotation>
      <xs:documentation>An AIML object is represented by an aiml element in an XML document.</xs:documentation>
      <xs:appinfo>
        <sch:title>Schematron validation</sch:title>
        <sch:ns prefix="aiml" uri="http://alicebot.org/2001/AIML-1.0.1"/>
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element name="topic">
          <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
              <xs:element name="category" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string" use="required"/>
          </xs:complexType>
        </xs:element>
        <xs:element name="category" type="xs:string"/>
      </xs:choice>
      <xs:attribute name="version" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="1.0.1"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
</xs:schema>

验证最简单的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<aiml version="1.0.1">
  <category/>
</aiml>

(假设与 XSD 没有外部联系)将产生错误,例如

[Error] try.xml:2:21: cvc-elt.1.a: Cannot find the declaration of element 'aiml'.

因为解析器从未找到 XSD

使用正确提示的 XSD 位置验证您最简单的 XML xsi:noNamespaceSchemaLocation

<?xml version="1.0" encoding="UTF-8"?>
<aiml version="1.0.1"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="try.xsd">
  <category/>
</aiml>

将产生错误,例如

[Error] try.xsd:10:26: TargetNamespace.2: Expecting no namespace, but the schema document has a target namespace of 'http://alicebot.org/2001/AIML-1.0.1'.
[Error] try.xml:4:47: cvc-elt.1.a: Cannot find the declaration of element 'aiml'.

现在错误是因为解析器找到了 XSD,并且XSD 表明targetNamespaceaiml元素应该在http://alicebot.org/2001/AIML-1.0.1namespace中。

此时,您必须确定您的意图是符合 XSD,即坚持 XML 实例的元素位于名称空间中,还是您的意图是修改 XSD 以使您的更简单的 XML 实例有效。

要修改 XSD 以消除对 XML 的命名空间要求:

要使您的 XML 在不位于名称空间的情况下有效,请从XSD 中targetNamespace="http://alicebot.org/2001/AIML-1.0.1"的元素中删除该属性。xs:schema

要符合 XSD:

要将 XML 的元素放入 XSD 所需的命名空间中,请按如下方式修改 XML:

<?xml version="1.0" encoding="UTF-8"?>
<a:aiml version="1.0.1"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:a="http://alicebot.org/2001/AIML-1.0.1"
      xsi:schemaLocation="http://alicebot.org/2001/AIML-1.0.1 try.xsd">
  <a:category/>
</a:aiml>

请注意a作为命名空间前缀的声明以及在and元素http://alicebot.org/2001/AIML-1.0.1上使用该前缀。还要注意通过属性指定命名空间的 XSD 。aimlcategoryhttp://alicebot.org/2001/AIML-1.0.1xsi:schemaLocation

于 2013-10-31T19:14:15.813 回答