XML中的命名空间

时间:2016-12-15 11:00:09

标签: xml xsd namespaces xml-namespaces

如果我有以下xsd片段(使用MyRootNs但无关紧要)

<xs:complexType name="SomeType">
    <xs:sequence>
        <xs:element name="SomeElement" type="ns1:SomeType" />
        ...

这会导致

<SomeType xmlns="MyRootNs" xmlns:ns1="MySecondNS">
    <SomeElement>
        ...
    </SomeElement>
</SomeType>

<SomeType xmlns="MyRootNs" xmlns:ns1="MySecondNS">
    <ns1:SomeElement>
        ...
    </ns1:SomeElement>
</SomeType>

我在

中找到了

XSD with elements from other namespace

https://www.codeproject.com/articles/18455/xsd-tutorial-part-of-namespaces

哪一个是正确的?

2 个答案:

答案 0 :(得分:0)

它也不会“导致”。架构中的SomeType是类型的名称,而不是元素声明的名称。它当然也可以是元素声明的名称,但我们不知道它所在的命名空间。我们也不能看到MySecondNS在模式中出现的位置(如果有的话)。

答案 1 :(得分:0)

您还没有真正提供足够的信息。正如Michael指出的那样,您无法从complexType定义创建XML元素。

但是,如果给出正确的模式,任何一种情况都是有效的。

我还应该指出,在这个示例中,xmlns:ns1 =&#34; MySecondNS&#34;语句什么都不做,它只是声明一个命名空间。宣布后不再使用。

<SomeType xmlns="MyRootNs" xmlns:ns1="MySecondNS">
    <SomeElement>
        ...
    </SomeElement>
</SomeType>

示例

如果您的架构看起来像这样

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.6978 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" targetNamespace="http://MyNamespce1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:q1="http://MyNamespce1">
    <xs:complexType name="SomeType">
        <xs:sequence>
            <xs:element  name="SomeElement" type="q1:SomeType" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>
    <xs:element name="MyRoot" type="q1:SomeType" />
</xs:schema>

enter image description here

然后Valid XML看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.6978 (https://www.liquid-technologies.com) -->
<MyRoot xmlns="http://MyNamespce1" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://MyNamespce1 Schema.xsd">
    <SomeElement>
        <SomeElement>
            <SomeElement></SomeElement>
        </SomeElement>
    </SomeElement>
</MyRoot>

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.6978 (https://www.liquid-technologies.com) -->
<ns:MyRoot xmlns:ns="http://MyNamespce1" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://MyNamespce1 Schema.xsd">
    <ns:SomeElement>
        <ns:SomeElement>
            <ns:SomeElement></ns:SomeElement>
        </ns:SomeElement>
    </ns:SomeElement>
</ns:MyRoot>

命名空间的规则在单个文件中相当简单,但在处理已包含或导入的多个模式文件时会变得相当复杂。在尝试理解导入/包含对命名空间的影响之前,我建议您理解适用于单个模式的规则。

如果您将来提供更完整的样本,也会有所帮助。