Использовать родительский элемент XML в качестве контейнера для повторяющихся дочерних элементов? - PullRequest
8 голосов
/ 21 июля 2009

Допустим, вы хотите, чтобы какой-то конкретный элемент XML встречался 0+ раз. Например, элемент <record> может встречаться несколько раз:

<repository>
  <record>Record 1</record>
  <record>Record 2</record>
  <record>Record 3</record>
</repository>

Есть ли веские причины для включения родительского элемента в качестве контейнера для них? Например, в следующем примере элемент <recordSet> содержит элементы <record>:

<repository>
  <recordSet>
    <record>Record 1</record>
    <record>Record 2</record>
    <record>Record 3</record>
  </recordSet>
</repository>

Я пытался найти любые связанные вопросы, прежде чем задавать это, поэтому приношу свои извинения, если они уже были заданы. Заранее спасибо за любой вклад!


Редактировать - 22 июля 2009 г .:

Спасибо всем за отличную обратную связь! (Я бы прокомментировал / проголосовал за людей, но у меня пока не хватает очков репутации.) Я, вероятно, продолжу этот путь, и я также хотел бы поблагодарить @ 16bytes за их совет, в том числе просто назвать родителя используя множественное число повторяющихся дочерних элементов.

Ответы [ 4 ]

10 голосов
/ 21 июля 2009

Вы наткнулись на второе из моих правил руководства по проектированию XML (первое - использовать атрибуты только для идентификаторов и реальных метаданных, третье - не использовать пространства имен, если не знаете, что вы что я пытаюсь использовать при разработке XML-документов. В дополнение к хорошему эмпирическому правилу, он также делает ваш документ:

  • легче моделировать в XML-схеме или других языках проверки
    • также проще повторно использовать комплексный тип
  • легче читать (ИМХО)
  • пользователям проще ворчать при просмотре документа
  • (вышеупомянутый) легче привязать к объекту ООП по вашему выбору

Одно предложение, я бы попробовал:

<Root>
   <Items>
     <Item>a</Item>
     <Item>b</Item>
     <Item>c</Item>
   </Items>
</Root>

Более простой суффикс "s" более лаконичен, его легче запомнить и применить. Если вы используете общее существительное коллекции, вы или его коллега забудете, какое из них в конечном итоге, так что вы увидите наборы, смешанные со списками, смешанными с контейнером. Но это больше стиль, чем хорошая практика, и я не хочу начинать религиозную войну;)

(UpperCamel для элементов !, lowerCamel для атрибутов! --Sorry)

3 голосов
/ 21 июля 2009

Наличие родительского элемента упрощает идентификацию разделов XML и упрощает для обработчиков сопоставление дочерних элементов с коллекцией. Если у вас есть система, которая запрещает использование атрибутов (некоторые делают это, это раздражает), вам также нужно использовать элементы-оболочки, чтобы различать свойства (например, идентификаторы), которые принадлежат конкретным дочерним элементам.

Кроме того, допустимо опускать родительский элемент, что может сделать файл заметно менее многословным.

В первом примере пользовательский элемент может смешиваться с записями, это допустимо, но может быть трудно обнаружить:

<repository>
  <record>Record 1</record>
  <record>Record 2</record>
  <user>Bill</user>
  <record>Record 3</record>
</repository>

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

<repositories>
  <users>
    <user>Bill</user>
  </users>
  <repository>
    <id>id1</id>
    <recordSet>
      <id>recordSet1</id>
      <record>Record 1</record>
      <record>Record 2</record>
      <record>Record 3</record>
    </recordSet>
    <recordSet>
      <id>recordSet2</id>
      <record>Record 1</record>
      <record>Record 2</record>
      <record>Record 3</record>
    </recordSet>
  </repository>
  <repository>
    <id>id2</id>
    <recordSet>
      <record>Record 1</record>
      <record>Record 2</record>
      <record>Record 3</record>
    </recordSet>
  </repository>
</repositories>
2 голосов
/ 07 января 2014

Хотя у меня также есть инстинктивное предпочтение для упакованных коллекций, интересно отметить, что Google придерживается другого мнения.

Элементы XML, которые просто обертывают повторяющиеся дочерние элементы, НЕ ДОЛЖНЫ использоваться. [Обоснование: они не используются в Atom и ничего не добавляют.]

1 голос
/ 21 июля 2009

Это полезно, если в вашем <repository> вы хотите включить несколько <recordSet> элементов:

<repository>
  <recordSet id="1">
    <record>Record 1</record>
    <record>Record 2</record>
    <record>Record 3</record>
  </recordSet>
  <recordSet id="2">
    <record>Record 2.1</record>
    <record>Record 2.2</record>
    <record>Record 2.3</record>
  </recordSet>
</repository>
...