XML文件中的默认命名空间不适用于XSD,为什么?

时间:2013-08-11 06:16:23

标签: xml namespaces xsd

我有一个XML文件和XSD。在这种形式下它工作正常:

<tns:Users xmlns:tns="http://www.example.org/NewXMLSchema">
    <User>
        <FirstName>Max</FirstName>
        <LastName>Gordon</LastName>
        <Salary>80000</Salary>
    </User>
    <User>
        <FirstName>Alex</FirstName>
        <LastName>Disel</LastName>
        <Salary>75000</Salary>
    </User>
</tns:Users>

<schema xmlns="http://www.w3.org/2001/XMLSchema"  
        targetNamespace="http://www.example.org/NewXMLSchema" 
        xmlns:tns="http://www.example.org/NewXMLSchema">
  <element name="Users">
    <complexType>
      <sequence maxOccurs="unbounded" minOccurs="1">
        <element name="User">
          <complexType>
            <sequence>
              <element name="FirstName" type="string"/>
              <element name="LastName" type="string"/>
              <element name="Salary" type="int"/>
            </sequence>
          </complexType>
        </element>
      </sequence>
    </complexType>
  </element>
</schema>

我想知道为什么它在另一个中没有:如果我在xml文件中省略了tns前缀?我的意思是它将成为默认命名空间:

<Users xmlns="http://www.example.org/NewXMLSchema">
    <User>
        <FirstName>Max</FirstName>
        <LastName>Gordon</LastName>
        <Salary>80000</Salary>
    </User>
    <User>
        <FirstName>Alex</FirstName>
        <LastName>Disel</LastName>
        <Salary>75000</Salary>
    </User>
</Users>

1 个答案:

答案 0 :(得分:2)

因为这些是不同的XML文档。

在第一个XML中:

<tns:Users xmlns:tns="http://www.example.org/NewXMLSchema">
    <User>
        <FirstName>Max</FirstName>
        <LastName>Gordon</LastName>
        <Salary>80000</Salary>
    </User>
    <User>
        <FirstName>Alex</FirstName>
        <LastName>Disel</LastName>
        <Salary>75000</Salary>
    </User>
</tns:Users>

只有根元素Users位于http://www.example.org/NewXMLSchema命名空间中。 所有其他元素都在{no namespace}中。

这与您的XML架构相对应。它确实定义了目标命名空间。 但它仅适用于全局元素Users。 所有其他元素都在本地声明,并确定其命名空间 通过elementFormDefault元素的<schema ...>属性。 您没有指定此属性,但它存在且其默认值为“不合格”。 这意味着所有本地元素都没有命名空间。

现在,让我们看看你的第二个XML:

<Users xmlns="http://www.example.org/NewXMLSchema">
    <User>
        <FirstName>Max</FirstName>
        <LastName>Gordon</LastName>
        <Salary>80000</Salary>
    </User>
    <User>
        <FirstName>Alex</FirstName>
        <LastName>Disel</LastName>
        <Salary>75000</Salary>
   </User>
</Users>

在这里,您直截了当地指明所有元素都位于http://www.example.org/NewXMLSchema命名空间(根和其他所有内容)。但这不符合您的XML架构!