这是 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
的定义?
答案 0 :(得分:0)
B 不,因为它重新声明了一个新的默认命名空间:null命名空间。在您的示例中,root
和A
位于ns
命名空间中。 xmlns
中的A
声明不是必需的,因为它从root
继承了命名空间。
在此示例中,A
,B
和root
都在ns
命名空间中:
<root xmlns="ns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="ns schema.xsd" >
<A>
<B/>
</A>
</root>
在另一个示例中,B
和root
位于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>