嵌套xml命名空间的做法是什么?

时间:2009-02-26 02:54:34

标签: xml namespaces xsd

在编程语言中,我习惯了

namespace foo
{
    namespace bar
    {
        void DoIt()
        {
        }
    }
}

int main()
{
    foo::bar::DoIt()
}

在架构(xsd)中,我想在定义complexTypes时做类似的事情

<xsd:schema targetNamespace="http://www.stackoverflow.com/foo">
 <xsd:complexType name="bar1">
    ...
 </xsd:complexType>
 <xsd:complexType name="bar2">
 </xsd:complexType>
   ...
 <xsd:complexType name="foo1" type = "bar1">
   ...
 </xsd:complexType>
</xsd:schema>

从概念上讲,我希望bar1和bar2嵌套在http://www.stackoverflow.com/foo::bar命名空间中(::从C ++中借用)。我已经看到了似乎是为条形码定义的完全第二个命名空间的示例。在这些示例中,条形码将在第二个名称空间“http://www.stackoverflow.com/foo/bar”中定义,如下例所示。这是我见过的最接近“嵌套”命名空间的地方。

所以我可以做的一件事是从不同的架构中导入条形码

<xsd:schema targetNamespace="http://www.stackoverflow.com/foo"
  xmlns:bar = "http://www.stackoverflow.com/foo/bar">
<xsd:schema namespace="http://www.stackoverflow.com/foo/bar"
 <xsd:complexType name="foo1">
   <xsd:element name="bar1Instance" type="bar:bar1"/>
   ...
 </xsd:complexType>
</xsd:schema>

部分原因是我只是试图了解XML与C ++之间的命名空间是如何不同的。 XML中是否存在嵌套命名空间的概念,或者每个命名空间是否独立?嵌套命名空间的概念如何实现或通常完成?它是否像我上面的例子那样完成了?命名空间是完全独立还是创建嵌套关系?

1 个答案:

答案 0 :(得分:6)

在XML中,每个命名空间都是完全独立的。命名空间的实际字符串不会以任何有意义的方式进行解析。它就是。 XML命名空间字符串通常是URL,因为这样很可能人们不会意外地为不相关的模式选择相同的命名空间。

如果您使用Google,则可以找到“嵌套XML命名空间”的示例。这些示例并不是在讨论您所要求的内容,而是在C ++(或Java或C#...)名称空间的意义上。这些示例显示了正在使用多个名称空间的XML文档。

XML命名空间字符串只是表示架构的不透明且唯一的字符串。如果两个命名空间字符串碰巧非常相似,那么它就没有任何意义。