我很难理解为什么我的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。
我做得对吗?
答案 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>