1

我试图理解遵循 XML Schema 处理的所有(复杂)规则,但我仍然无法弄清楚!我的问题是这样的:

  • 我有一个 XSD;
  • 我想创建和验证基于这个 XSD 的 XML 文件,没有元素前缀;
  • 我希望 jEdit、Eclipse 等编辑器能够处理基于 XSD 的自动完成功能。

但是,所有验证编辑器都会给我相同的错误消息。

这是 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}”之一。

有什么建议么?

4

3 回答 3

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 设计人员会认为这是一个很好的建议。

于 2012-04-12T14:36:34.643 回答
0

您可以从这里了解很多关于命名空间及其在验证方面的关系。

XML 模式验证

于 2012-04-12T14:38:14.130 回答
0

请记住,前缀是无关紧要的。重要的是命名空间。

如果您希望“maps”元素不在命名空间中,则必须在模式中以这种方式声明它。当前,您已将其声明为具有目标命名空间的架构文档中的全局元素声明。

你的要求似乎很奇怪。您的实例文档声明了一个命名空间,但随后它不会将该命名空间用于文档中的任何元素。这是合法的,但这是一件非常奇怪的事情。

于 2012-04-12T14:43:06.963 回答