学习 XSD 有点新鲜。
如果我有这个 XSD 有效架构,如下所示:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="optional">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="10"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
为什么这个 XML 没有被正确验证。
<?xml version="1.0"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
</note>
<optional>hi</optional>
如果我尝试根据 XSD 验证 XML,则会出现以下错误消息。
文档中根元素后面的标记必须格式正确。
我应该在 XML 中的哪里使用可选元素?
这不是 XSD 验证错误;而是 XSD 验证错误。所有 XML 文档,无论任何关联的模式如何,都必须只有 1 个根元素。你不能拥有这个:
<?xml version="1.0"?>
<note>...</note>
<optional>hi</optional>
您的 XML 文档必须如下所示:
<?xml version="1.0"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
</note>
或者只是:
<?xml version="1.0"?>
<optional>hi</optional>
XSD 可以定义多个全局元素,但这并不意味着相应的 XML 文档中有多个根元素。
在本例中,您仅发布了 XSD 的摘录,但也许还有另一个元素应该是根元素,并且它本身就是
note
和 optional
的父元素,所以实际上您的 XML 应该是是这样的:
<?xml version="1.0"?>
<root>
<optional>hi</optional>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
</note>
</root>
无论如何,您需要决定哪个元素是根。 XSD 的一件烦人的事情是,无法从众多全局元素中将一个全局元素标记为根。出于这个原因,许多 XSD 的设计仅包含一个全局元素,其余的都是带有子元素的全局复杂/简单类型。