使用空命名空间的XML Schema验证

时间:2012-04-12 14:27:57

标签: java xml xsd schema

我试着理解遵循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'开始发现无效内容。预计会有一个“{map}”。

有什么建议吗?

3 个答案:

答案 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)

您可以从此处了解有关命名空间及其与验证关系的很多信息。

XML Schema Validation

答案 2 :(得分:0)

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

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

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