XML不会丢失架构错误

时间:2013-02-28 12:48:20

标签: xml xsd

我很难理解为什么我的xml和架构无法正常工作。

架构:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">

<xs:element name="animals">
    <xs:element name="animal">
        <xs:complexType>
            <xs:element name="species"/>
            <xs:element name="name"/>
            <xs:element name="population" minOccurs="1"/>
        </xs:complexType>

    </xs:element>
</xs:element>

XML:

<?xml version="1.0"?>

<animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="animals.xsd">
    <animal>
        <species>reptile</species>
        <name>cobra</name>

    </animal>
</animals>

不应该抛出错误,因为当min发生时,xml文件中缺少填充为1。

我做得对吗?

2 个答案:

答案 0 :(得分:2)

你正在做几件事情。以下是您可能希望添加到该列表中的更多内容:

  • 您创建和定义的命名空间应使用您有权控制的域名。除非您拥有域w3schools.com,否则最好不要在其空间中定义新的命名空间。如果您不拥有任何域,并且只想要一个示例,则域example.com将保留用于此目的。或者您可以编写没有目标名称空间的模式。

  • xsi:schemaLocation属性的值不是单个URI,而是一对URI对。在每对中,第一项命名命名空间,第二项指定XSD验证器可以在何处找到该命名空间的模式文档。因此,您希望该属性在XML文档实例中看起来像这样:

    xsi:schemaLocation="http://www.w3schools.com animals.xsd"
    

    或者,如果您重写架构文档以省略目标命名空间,请改用xsi:noNamespaceSchemaLocation:

    xsi:noNamespaceSchemaLocation="animals.xsd"
    
  • 您的架构文档当前指定其目标命名空间为http://www.w3schools.com,并且本地元素是完全限定的。因此,如果您希望架构处理器能够识别您显示的声明旨在应用于这些XML元素实例,那么XML中的所有元素都应该位于该命名空间中。因此,在您的XML中,animals的开始标记应该说类似

    <animals xmlns="http://www.w3schools.com"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="
            http://www.w3schools.com animals.xsd
            ">
    
  • 根据您展示的内容,我希望XSD验证器能够反对xsi:schemaLocation的值没有偶数个令牌的事实。如果没有,那么你调用它的方式可能会出现问题;但是,如果没有关于您正在使用的验证器以及如何调用它的更多信息,则很难确定。

  • 大多数XSD验证器开始在所谓的宽松验证模式下工作:当他们在文档中看到一个元素声明的元素时,他们验证它,否则他们跳过它(或者在某些实现中)然后他们检查孩子们是否在寻找可以验证的元素。

    给定描述特定命名空间中元素的模式,以及使用不在该命名空间中的元素的XML文档,在宽松验证模式下启动的XSD验证器将无法判断文档实例中的元素是否有效或不。 XSD规范说,在这种情况下,document元素的validity属性的值为notKnown。大多数XSD验证程序仅在遇到无效元素时才会发出错误消息,因此大多数XSD验证程序在文档上以松散模式启动,其中没有任何内容与架构匹配,不会发出任何错误消息。重要的是不要将此与文档对模式有效的判断混淆;它只表示该文档对模式不是无效

    如果您发现此行为不方便或令人困惑,就像许多人一样,您将需要检查您使用的验证程序是否允许调用时标志发出错误,或者至少是警告,如果文档不能确认有效。 (符合XSD 1.1验证器要求能够执行此操作; XSD 1.0对一致性要求有点不确定。)或者验证器可能允许您说文档需要animals元素在{ {1}}命名空间,如果是其他任何内容,则应该引发错误。如果你的验证人没有给你控制它如何开始工作,让供应商知道你宁愿有一些控制权,同时寻找一个不同的验证器。

[P.S。另请参阅Michael Kay对此答案的评论,以考虑另一个要点。]

答案 1 :(得分:1)

您的架构看起来有误 - 您无法将xs:element直接放在xs:element内(也不会直接置于xs:complexType内)。

我认为你想要的是

<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.w3schools.com"
  xmlns="http://www.w3schools.com"
  elementFormDefault="qualified">

  <xs:element name="animals">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="animal" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="species"/>
              <xs:element name="name"/>
              <xs:element name="population" minOccurs="1"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

然后您的XML文件应使用架构命名空间:

<animals 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="animals.xsd" 
   xmlns="http://www.w3schools.com">
  <animal>
    <species>reptile</species>
    <name>cobra</name>
  </animal>
</animals>