Как сделать документ XML, который содержит отношения? - PullRequest
2 голосов
/ 26 января 2010

Хорошо, это может звучать глупо, но я не очень знаком с XML.

Я пытаюсь сделать следующее:

У меня есть две организации: Компания и Сотрудник . Обе сущности имеют только свойство name .

Как бы выглядел XML-документ, когда у меня было две компании, в каждой из которых было по два сотрудника? Могу ли я просто сделать что-то подобное? :

<?xml version="1.0"?>
  <company>
    <name>Apple</name>
    <employee>Steve</employee>
    <employee>Bill</employee>
  </company>
  <company>
    <name>Banana</name>
    <employee>John</employee>
    <employee>Luke</employee>
  </company>

Это хороший синтаксис? Или я должен сделать это иначе, чем это? Что-то важное пропущено?

Редактировать Для сравнения я скопировал действительный пример XML из USGS (Институт наблюдения землетрясений, который публикует данные о землетрясениях через XML):

<?xml version="1.0"?>
<feed xml:base="http://earthquake.usgs.gov/" xmlns="http://www.w3.org/2005/Atom" xmlns:georss="http://www.georss.org/georss">
  <updated>2010-01-26T09:36:26Z</updated>
  <title>USGS M2.5+ Earthquakes</title>
  <subtitle>Real-time, worldwide earthquake list for the past day</subtitle>
  <link rel="self" href="/earthquakes/catalogs/1day-M2.5.xml"/>
  <link href="http://earthquake.usgs.gov/earthquakes/"/>
  <author><name>U.S. Geological Survey</name></author>
  <id>http://earthquake.usgs.gov/</id>
  <icon>/favicon.ico</icon>
  <entry><id>urn:earthquake-usgs-gov:us:2010ryav</id><title>M 5.2, southern Sumatra, Indonesia</title><updated>2010-01-26T06:53:25Z</updated><link rel="alternate" type="text/html" href="/earthquakes/recenteqsww/Quakes/us2010ryav.php"/><summary type="html"><![CDATA[<img src="http://earthquake.usgs.gov/images/globes/0_100.jpg" alt="0.343&#176;S 99.024&#176;E" align="left" hspace="20" /><p>Tuesday, January 26, 2010 06:53:25 UTC<br>Tuesday, January 26, 2010 01:53:25 PM at epicenter</p><p><strong>Depth</strong>: 58.50 km (36.35 mi)</p>]]></summary><georss:point>-0.3427 99.0242</georss:point><georss:elev>-58500</georss:elev><category label="Age" term="Past day"/></entry>


  <entry><id>urn:earthquake-usgs-gov:pr:p1002601</id><title>M 2.7, Puerto Rico region</title><updated>2010-01-26T04:14:07Z</updated><link rel="alternate" type="text/html" href="/earthquakes/recenteqsww/Quakes/prp1002601.php"/><summary type="html"><![CDATA[<img src="http://earthquake.usgs.gov/images/globes/20_-65.jpg" alt="19.102&#176;N 66.415&#176;W" align="left" hspace="20" /><p>Tuesday, January 26, 2010 04:14:07 UTC<br>Tuesday, January 26, 2010 12:14:07 AM at epicenter</p><p><strong>Depth</strong>: 13.80 km (8.57 mi)</p>]]></summary><georss:point>19.1017 -66.4150</georss:point><georss:elev>-13800</georss:elev><category label="Age" term="Past day"/></entry>


  <entry><id>urn:earthquake-usgs-gov:hv:00036408</id><title>M 3.0, Island of Hawaii, Hawaii</title><updated>2010-01-26T00:37:14Z</updated><link rel="alternate" type="text/html" href="/earthquakes/recenteqsww/Quakes/hv00036408.php"/><summary type="html"><![CDATA[<img src="http://earthquake.usgs.gov/images/globes/20_-155.jpg" alt="19.206&#176;N 155.517&#176;W" align="left" hspace="20" /><p>Tuesday, January 26, 2010 00:37:14 UTC<br>Monday, January 25, 2010 02:37:14 PM at epicenter</p><p><strong>Depth</strong>: 37.70 km (23.43 mi)</p>]]></summary><georss:point>19.2063 -155.5173</georss:point><georss:elev>-37700</georss:elev><category label="Age" term="Past day"/></entry>

</feed>

Они не используют корневой элемент, такой как <entries>! И пример с Apple seismicXML прекрасно работает с этой штукой. Странно ...

Ответы [ 4 ]

2 голосов
/ 26 января 2010

Вам не хватает корневого элемента, такого как:

<?xml version="1.0"?>
<companies>
    <company>...</company>
    <company>...</company>
</companies>

В противном случае, я думаю, что эта структура хороша для представления отношений сотрудников компаний один ко многим.

В ответ на опубликованную вами ленту USGS имеет корневой элемент feed.

1 голос
/ 26 января 2010

XML на самом деле не был создан для моделирования данных. Это было сделано для сериализации данных. Лучше моделировать с использованием ER-диаграмм и думать о представлении XML только после того, как вы определились с моделью данных.

Обычно, когда ваши отношения образуют дерево, вы можете моделировать их с помощью подэлементов. Когда они этого не делают, вы можете предпочесть какие-либо ссылки. Например, в этом случае Включение элементов сотрудника в элементы компании будет достаточным, если каждый сотрудник связан только с одной компанией. Но если один и тот же сотрудник должен быть указан в нескольких компаниях, вы начнете дублировать данные. Чтобы избежать этого, может быть предпочтительным включение ссылок из одного элемента в другой.

Технология XML имеет некоторую поддержку ссылок (например, вы можете использовать идентификаторы и атрибуты IDREF и проверить их правильное использование с DTD), но не так много, и она, конечно, не говорит вам, как и где использовать такие ссылки. 1005 *

1 голос
/ 26 января 2010

Вы также можете рассмотреть возможность комбинирования предыдущего примера, имея имя в качестве атрибута, например:

<?xml version="1.0"?>
<companies>
    <company name="Apple">
        <employee>Steve</employee>
        <employee>Bill</employee>
    </company>
    <company name="Banana">
        <employee>John</employee>
        <employee>Luke</employee>
    </company>
</companies>
0 голосов
/ 26 января 2010

Вы НЕ должны полагаться на наименование. Вы должны дать каждому сотруднику идентификатор (то же самое для компании). Потому что иначе у вас не может быть двух сотрудников с одинаковым именем.

Пример:

<data>
    <company id="0">
      <name>Apple</name>
      <employee>0</employee>
      <employee>1</employee>
    </company>
    <company id="1">
      <name>Banana</name>
      <employee>2</employee>
      <employee>3</employee>
    </company>
    <employee id="0" name="Steve"/>
    <employee id="1" name="Bill"/>
    <employee id="2" name="John"/>
    <employee id="3" name="Luke"/>
  </data>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...