Xml架构中的全局声明

时间:2010-10-20 18:25:20

标签: xml xsd

a)为什么全局元素和属性声明必须始终属于命名空间,因此必须始终在实例文档中限定?

b)本地元素/属性声明(其form属性设置为unqualified)是否仍然是模式目标命名空间的一部分,即使它们与实例文档中的任何命名空间无关?

c)即使类型/组声明是全局的,它仍然是目标命名空间的一部分,因此在引用全局声明时,我们必须包含目标命名空间前缀。

无论如何,是否有一个特殊原因导致全局声明是目标命名空间的一部分而本地声明不是?也就是说,即使全局类型/组声明不属于目标命名空间,我们仍然可以在我们的Xml架构中引用它们,因此它们必须有其他好处才能成为命名空间的一部分?!

谢谢

编辑:

  

@ user437291:如果你明白了   名称空间和概念   限定名称为什么使用单词   “本地”和“全球”不是一个   这个概念的一部分?

但为什么本地类型声明需要是Xml Schema目标命名空间的成员?它们不是从实例文档或其他Xml架构中引用的,那么它们作为目标命名空间成员的目的/好处是什么?

  此外,是否一个问题   元素或属性属于a   命名空间真的独立于   它的“资格”。它是   不同的属性,如颜色和   事物的大小。

元素/属性如何属于命名空间,同时不必在实例文档中限定?在编程语言中,如果类型T是名称空间N1的成员,则意味着其完全限定名称为N1.T,因此其他类型需要使用完全限定名称{来引用此类型{1}}(这里我忽略了N1.T指令等)。

我希望它与Xml Schemas和xml实例文档相同 - 因此,据我所知,当Xml Schema验证器解析using遇到限定元素Contacts.xml时,它会搜索contact:firstName使用名称http://www.someDomain.com.firstName的匹配元素声明。

找到匹配后,验证器继续执行Contacts.xsd中的下一个元素Contacts.xml。看到lastName元素为lastName,它会在unqualified中搜索名为Contacts.xsd的元素声明。现在,如果在lastName范围内,其完全限定名称为Contacts.xsd,则验证者将无法找到匹配的声明!但它确实找到了一个匹配的声明,所以我假设http://www.someDomain.com.lastName不是命名空间http://www.someDomain.com的成员

Contacts.xml

lastName

Contacts.xsd

<?xml version="1.0" encoding="UTF-8"?>
<contact:contact      
     xmlns:contact="http://www.someDomain.com"
     xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
     xs:schemaLocation="http://www.someDomain.com contacts1.xsd">
            <contact:firstName></contact:firstName>
            <lastName></lastName>         
</contact:contact>

1 个答案:

答案 0 :(得分:4)

在我看来,你的问题与对特殊namspace的理解有关:“no namespace”。在下面的简单XML文档中

<?xml version="1.0" encoding="utf-8"?>
<root>
    <myElement>Bla Bla</myElement>
</root>

rootmyElement元素都有一个名为“no namespace”的特殊命名空间。您可以定义相应的XML Schema:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="myElement" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

因为在架构中没有使用targetNamespace,所以架构定义了“无命名空间”的架构。

顺便说一下,模式“http://www.w3.org/2001/XMLSchema-instance”为您提供了一种从XML文档引用模式的简便方法。让我们将上述模式文档保存在文件NoNamespace.xsd中,并将我们保存的XML文档保存在文件NoNamespace.xml中。此外,我们将两个文件放在同一个文件夹中。然后我们可以将XML文档修改为以下

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="NoNamespace.xsd">
    <myElement>Bla Bla</myElement>
</root>

现在我们对我们使用的架构有一个显式引用。

关于合格元素名称或合格属性名称的问题与您的主要问题无关。这很容易解释。 qualified names不再是具有名称空间前缀的名称,如<xs:element>xsi:noNamespaceSchemaLocation="NoNamespace.xsd"。所以限定可以是元素和属性。

在一个文档中,您可以将元素belonds混合到不同的命名空间。例如,在以下文档中

<?xml version="1.0" encoding="utf-8"?>
<root>
    <html xmlns="http://www.w3.org/1999/xhtml">
        <body>
            <p>Hello!</p>
        </body>
    </html>
    <myElement>
        <myChild xmlns="http://www.ok-soft-gmbh.com/xsd/test/123">
            <mySubChild xmlns="">
                <x></x>
            </mySubChild>
            <mySecondChild>Hello!<mySecondChild>
        </myChild>
    </myElement>
</root>

元素<html>及其子元素具有“http://www.w3.org/1999/xhtml”命名空间,应该针对众所周知的XHTML模式进行验证。元素<root><myElement>具有“无名字”。元素<myChild><mySecondChild>具有名称空间“http://www.ok-soft-gmbh.com/xsd/test/123”。元素<mySubChild><x>元素一样也有“无名字”,如<root><myElement>。所以一切都很简单。

更新:如果我理解你的更正,那么在XML Schema中定义的所有类型都将在您的定义中为“全局”。您无法定义“内部”或“私人”类型。

我不确定您在示例中包含的XML文件和XSD架构有什么问题。您可以使用与以下相同的模式重写XML文件对您有所帮助:

<?xml version="1.0" encoding="UTF-8"?>
<contact xmlns="http://www.someDomain.com"
         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
         xs:schemaLocation="http://www.someDomain.com Contacts.xsd">
    <firstName></firstName>
    <lastName xmlns=""></lastName>
</contact>

因此元素lastName在模式Contacts.xsd中定义,但它被定义为“无名称空间”中的元素。您的XML架构表示<contact>中的"http://www.someDomain.com"元素必须包含两个子元素:来自firstName“http://www.someDomain.com”的targetNamespace元素和元素来自“无命名空间”的lastName。我希望它会对你有所帮助。