0

对于这种 XML,最简单/最清晰的 XSD 样式是什么?(来自这个答案

<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 和说明移到了答案中。

4

2 回答 2

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>

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

于 2009-04-26T05:04:57.427 回答
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)

但它略有不同,因为根始终是一个对象(而不是字符串),并且它本身被命名(即使它不在另一个对象内):

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

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

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

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

处理这种特殊情况比原始情况更复杂,即使经过重构以最小化这种复杂性:

F ==> (string K | O)*
O ==> F K
于 2009-04-27T06:42:17.823 回答