遵循模式而不在xml中指定它

时间:2014-03-20 12:45:21

标签: xml xsd

如果我有这样的文件(注意它没有指向架构): data.xml中

<?xml version="1.0"?>
<data>
    <item>
        <note>2008</note>
        <title>1</title>
    </item>
</data>

和这样的架构:

myschema.xsd

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="data">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:all>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string"/>
          </xs:all>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

我可以为验证器指定架构:

$ xmllint --schema myschema.xsd data.xml
<?xml version="1.0"?>
<data>
    <item>
        <note>2008</note>
        <title>1</title>
    </item>
</data>
data.xml validates

它正常工作。但是,在大多数我在线阅读的例子中,架构是直接在xml文件中指定的,例如:

<hockeyTeam xmlns="http://www.nhl.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

为这样的特定元素指定模式有什么好处?架构是否在验证以外的任何位置使用?

1 个答案:

答案 0 :(得分:1)

您所展示的内容不是specifying the schema for a particular element的示例,至少不是大多数人与此声明相关的方式 - 我之所以这样说是因为您没有展示任何内容处理模式位置的XSI属性。

查看noNamespaceSchemaLocationschemaLocation属性。这两个将分别用于没有和使用命名空间的模式。

您可能获得的优势取决于具体情况。在安全的生产环境中,没有人关心这些属性;即他们不会&#34;跟随&#34;。编辑可能会乐意使用它们,将它们视为在其他机制不存在时应用模式的一种方式,例如显式模式分配,模式目录等。某些XML处理器,XSD感知,可能有选项,你可以打开和关闭,以处理这些属性。其他处理器,不要。

总的来说,由于创造的问题越多而不是解决,我就不会真正将其视为“优势”。一个是人们交换XML(作为文档包的一部分),但是在上面提到的属性中XSD的位置在人们正在查看它们的不同机器上或者由于使用不同的XML而不同处理器。

我建议如果它们适合你,可以使用它们,但是避免使用这些属性生成/释放XML给其他人。