我试着理解遵循XML Schema处理的所有(复杂)规则,但我仍然无法理解这一点! 我的问题是:
但是,所有验证编辑都会给我相同的错误消息。
以下是XSD的精简版:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www.megadix.org/standards/temp.xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jfcm="http://www.megadix.org/standards/temp.xsd"
elementFormDefault="unqualified" attributeFormDefault="unqualified">
<xsd:complexType name="MapsType">
<xsd:sequence>
<xsd:element name="map" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="name" type="xsd:string" use="required"></xsd:attribute>
<xsd:sequence>
<xsd:element name="description" type="xsd:string" minOccurs="0" maxOccurs="1"></xsd:element>
<xsd:element name="concepts" minOccurs="0" maxOccurs="1">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="concept" minOccurs="0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="name" type="xsd:string" use="required"></xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="maps" type="jfcm:MapsType"></xsd:element>
如果我使用前缀,文件会正确验证并自动完成:
<?xml version="1.0" encoding="UTF-8"?>
<jfcm:maps xmlns:jfcm="http://www.megadix.org/standards/temp.xsd">
<map name="Test Map">
<concepts>
<concept name="c1" />
<concept name="c2" />
<concept name="c3" />
</concepts>
</map>
但如果我删除它:
<?xml version="1.0" encoding="UTF-8"?>
<maps xmlns:jfcm="http://www.megadix.org/standards/temp.xsd">
<map name="Test Map">
<concepts>
<concept name="c1" />
<concept name="c2" />
<concept name="c3" />
</concepts>
</map>
我收到此错误消息:
从元素'map'开始发现无效内容。预计会有一个“{map}”。
有什么建议吗?
答案 0 :(得分:3)
由于你对元素的形式使用“不合格”,这是正确的方法:
<?xml version="1.0" encoding="UTF-8"?>
<maps xmlns="http://www.megadix.org/standards/temp.xsd">
<map name="Test Map" xmlns="">
<concepts>
<concept name="c1" />
<concept name="c2" />
<concept name="c3" />
</concepts>
</map>
</maps>
如果要在命名空间中“共享”所有元素,则必须定义elementFormDefault =“qualified”;作为一个侧边栏,许多XSD设计师会认为这是一个很好的建议。
答案 1 :(得分:0)
您可以从此处了解有关命名空间及其与验证关系的很多信息。
答案 2 :(得分:0)
请记住,前缀无关紧要。它是重要的命名空间。
如果您希望“maps”元素不在命名空间中,那么您必须在架构中以这种方式声明它。目前,您已将其声明为具有目标命名空间的架构文档中的全局元素声明。
你的要求似乎很奇怪。您的实例文档声明了一个命名空间,但它不会将该命名空间用于文档中的任何元素。这是合法的,但这是一件非常奇怪的事情。