Что является самым простым / понятным XSD для этого XML? - PullRequest
0 голосов
/ 26 апреля 2009

Какой самый простой / понятный стиль XSD для этого вида XML? (это от этот ответ )

<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 ]

2 голосов
/ 26 апреля 2009

Если ваши данные не являются полностью свободным форматом, я бы сделал 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>

Но не делайте имя типа строки необязательным! (По крайней мере из того, что вы нам показали, делать это не имеет смысла.)

0 голосов
/ 27 апреля 2009

Вот 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 более регулярными - и более простыми. Следовательно, объекту всегда проще иметь имя.

Разъяснение : особый случай будет таким, что когда Объект является корнем, он не называется, но во всех других случаях он именуется. Для этого требуется дополнительный раздел заголовка, например:

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

Работа с этим особым случаем более сложна, чем с оригиналом, даже если рефакторинг минимизирует эту сложность:

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