如果未在全局级别定义元素,为什么会忽略targetNamespace?

时间:2014-06-26 12:39:46

标签: xml xsd xml-namespaces xsd-validation

这是 schema.xsd 。 它定义了targetNamespace ns,其中元素'A'包含元素'B'

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="ns">
    <xsd:element name="root"/>

    <xsd:element name="A">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="B" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

这是 doc.xml 。 它有一个'A'节点,包含一个'B'节点。 此xml根据架构有效。

<root 
    xmlns="ns"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="ns schema.xsd" >

    <A xmlns="ns">
        <B xmlns=""/>
    </A>

</root>

这听起来还不错......除了'B'不在命名空间ns中!

根据msdn'B'应位于名称空间ns中。

  

targetNamespace是所有架构组件的命名空间   模式以及使用include元素

包含的任何模式

问题在哪里:根据我的理解或targetNamespace的定义?

1 个答案:

答案 0 :(得分:0)

命名空间 ns

B ,因为它重新声明了一个新的默认命名空间:null命名空间。在您的示例中,rootA位于ns命名空间中。 xmlns中的A声明不是必需的,因为它从root继承了命名空间。

在此示例中,ABroot都在ns命名空间中:

<root xmlns="ns"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="ns schema.xsd" >

    <A>
        <B/>
    </A>
</root>

在另一个示例中,Broot位于ns命名空间中,但A位于 null 命名空间中:

<root xmlns="ns"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="ns schema.xsd" >

    <A xmlns="">
        <B xmlns="ns"/>
    </A>
</root>