Как бы вы описали это в XML / XSD? - PullRequest
1 голос
/ 29 марта 2011

Я не уверен, что будет хорошей XML-структурой для следующего ...

Предположим, что тип поля, скажем, , может иметь разные «разновидности», например, любой человек являетсялокальная ссылка определяется только некоторым идентификатором, или это глобальная ссылка с различными элементами адреса.Какова будет хорошая структура XML для этого, чтобы ее можно было легко описать в схеме (файл xsd)?

Я вижу две стратегии - обе с некоторыми существенными недостатками:

тип person определяется как отдельный элемент, скажем, , но тогда я предполагаю, что схема не может определить, какие из типов конкретных полей являются обязательными:

<person>
   <type>local</type>
   <id>12345</id>
</person>
<person>
   <type>global</type>
   <name>Some Name</name>
   <address>Some Street 42</address>
   <city>Some City</some>
</person>

В этом случае должен толькобыть обязательным для "локальных" типов лиц и аналогично полям для "глобальных" типов лиц.

Другая стратегия заключается в определении нового типа узла для каждого подтипа человека, но тогда мы не можем сказать, чтокаждый подтип на самом деле просто разновидность :

<personLocal>
   <id>12345</id>
</personLocal>
<personGlobal>
   <name>Some Name</name>
   <address>Some Street 42</address>
   <city>Some City</some>
</personGlobal>

Какова хорошая стратегия для моделирования таких структур?

Ответы [ 3 ]

1 голос
/ 29 марта 2011

Вы можете использовать следующую (частичную) схему:

    <xs:element name="person">
      <xs:complexType>
        <xs:choice>
          <xs:element name="id" type ="xs:int"/>
          <xs:sequence>
            <xs:element name="name" type="xs:string" />
            <xs:element name="address" type="xs:string" />
            <xs:element name="city" type="xs:string" />
          </xs:sequence>
        </xs:choice>
      </xs:complexType>
    </xs:element>

Внимание: тег xs:choice.

Это приведет к следующему:

  • Когда первый тег внутри тега person является тегом id, другие теги не допускаются.
  • Если первый тег внутри тега person является тегом name, теги address и city являются обязательными, тег id не допускается.
0 голосов
/ 29 марта 2011

Один из обходных путей (тот, который я, вероятно, заканчиваю) - это определить схему, как показано ниже, потому что разные типы людей (есть больше, чем два примера, которые я объяснил) могут содержать одни и те же поля:

<xs:element name="person">
<xs:complexType>
  <xs:choice>
    <xs:element name="local">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="id" type ="xs:int"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    <xs:element name="global">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="name" type="xs:string" />
          <xs:element name="address" type="xs:string" />
          <xs:element name="city" type="xs:string" />
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:choice>
</xs:complexType>

0 голосов
/ 29 марта 2011

Для меня я делаю так:

<parent>
  <local>
    <person>
      <name />
      <adress />
      <city />
    </person>    
  </local>
  <global>
    <person>
      <name />
      <adress />
      <city />
    </person>    
  </global>
<parent>

Или вот так:

<person type='local'>
  <name />
  <adress />
  <city />
</person>    
<person type='global'>
  <name />
  <adress />
  <city />
</person>

:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...