这个XML最简单/最清晰的XSD是什么?

时间:2009-04-26 04:44:42

标签: xml xsd grammar

这种XML最简单/最清晰的XSD样式是什么? (它来自this answer

<object name="contact">
  <object name="home">
    <object name="tel">
       <string name="area" value="910"/>
       <string name="num" value="1234 5678"/>
    </object>
  </object>
  <object name="work">
    <object name="tel">
       <string name="area" value="701"/>
       <string name="num" value="8888 8888"/>
    </object>
    <object name="fax">
       <string name="area" value="701"/>
       <string name="num" value="9999 9999"/>
    </object>
  </object>
</object>

编辑我将我的示例XSD和澄清移动到答案中。

2 个答案:

答案 0 :(得分:2)

如果您的数据不是完全免费的格式,我会根据您的数据模型制作XML:

<contact>
  <home>
    <tel>
       <area>910</area>
       <num>1234 5678</num>
    </tel>
  </home>
  <work>
    <tel>
       <area>701</area>
       <num>8888 8888</num>
    </tel>
    <fax>
       <area>701</area>
       <num>9999 9999</num>
    </fax>
  </work>
</contact>

但是,假设您有理由按照自己的方式进行操作(例如,假设您的数据确实是完全自由格式的结构化数据),您可以通过以下方式使XSD更加清晰:做这样的事情:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="object">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="string"/>
        <xs:element ref="object"/>
      </xs:choice>
      <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
  </xs:element>

  <xs:element name="string">
    <xs:complexType>
      <xs:attribute name="name" type="xs:string"/>
      <xs:attribute name="value" type="xs:string"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

我更喜欢模式,其中每个element以独立的方式定义 - 尽可能多 - 并且在多个地方使用的任何类型也是单独定义的。在您的情况下,没有重用类型。

当XSD深度嵌套时,它会变得更难阅读,更难以支持和修改。

注意:您可以通过进行此更改使对象名称成为可选项:

  <xs:element name="object">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="string"/>
        <xs:element ref="object"/>
      </xs:choice>
      <xs:attribute name="name" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

但是也不要让字符串类型的名称可选! (至少从您向我们展示的内容来看,这样做是没有意义的。)

答案 1 :(得分:0)

这是一个XSD - 它的语法是最清晰的方法吗?

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="object">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">

        <xs:element name="string">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute name="value" type="xs:string"/>
          </xs:complexType>
        </xs:element>

        <xs:element ref="object"/>

      </xs:choice>
      <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
  </xs:element>

</xs:schema>

XML的基本思想是嵌套对象:

V --> string | O      // a Value is a string or an Object
O --> (K V)*          // an Object is list of named values (Key-Value pairs)

但它略有不同,因为根始终是一个Object(不是字符串),它本身也被命名(即使它不在另一个Object中):

O ==> (string K | O)* K

我愿意稍微改变格式本身,以提供不同的XML,如果这样可以使XSD变得更简单/更清晰。如果一个Object总是有一个名字,这将删除特殊情况,这使得语法和XSD更加规则 - 更简单。因此,对象总是有一个名称似乎更简单。

澄清:特殊情况是,当Object是根时,它没有被命名,但在所有其他情况下,它被命名。这需要一个额外的标题部分,如下所示:

O'==> (string K | O)*
O ==> (string K | O)* K

处理这种特殊情况比原始情况更复杂,即使在重构时也要最小化这种复杂性:

F ==> (string K | O)*
O ==> F K