Как список должен быть представлен в XML?

Как должен быть представлен список в XML?

С сущностью включающего списка:

<person>
    <firstname>Joe</firstname>
    <lastname>Bloggs</lastname>

    <children>
        <child .../>
        <child .../>
        <child .../>
        <child .../>
        <child .../>
    </children>
</person>

Или без:

<person>
    <firstname>Joe</firstname>
    <lastname>Bloggs</lastname>

    <child .../>
    <child .../>
    <child .../>
    <child .../>
    <child .../>
</person>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
950
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Я бы заключил его в объект, чтобы отличать его от других элементов.

Согласен по причине, указанной Джейсоном Джексоном ниже.

dacracot 16.01.2009 03:17

Кроме того, у вас могут быть <children type = "step"> <child ... /> <child ... /> </children> и <children type = "full"> .... </children>, чтобы вы могут иметь списки различных типов потомков, если вы используете включающую сущность.

Eddie 26.01.2009 06:13

ИМХО, это зависит от домена.

В приведенном вами примере я бы использовал сущность для включения дочерних элементов, потому что сами дочерние элементы не обязательно являются свойствами человека, но список дочерних элементов таковым является.

Кроме того, использование корпуса поможет, если вам когда-нибудь понадобится сериализовать / десериализовать.

Первый хорошо подойдет для простых списков, но что, если бы список сам содержал вложенный список ?! Что, если бы у элемента было несколько разных списков? Чтобы сохранить последовательность, я предпочитаю элемент для списка и использование тега <item> или чего-то еще для дочерних данных. Это поможет использовать универсальную функцию для анализа всех списков.

Ответ принят как подходящий

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

Хорошая точка зрения. Я могу придумать атрибут для детей ... супруга ... так, если бы ребенок был от другого брака.

dacracot 16.01.2009 03:14

Не имеет большого значения, если имена элементов в списке всегда одинаковы, потому что если вы обрабатываете его с помощью XPath или Linq-to-XML или чего-то еще, тогда в запросе будет просто еще один селектор если есть узел-оболочка, но в остальном будет идентичным.

С другой стороны, если имена элементов в списке могут отличаться, это может упростить обработку списка, если есть элемент-оболочка, потому что вы можете просто использовать '*' в качестве селектора под элементом списка, вместо того, чтобы фильтровать все элементы с указанным набором имен.

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

Подумайте об этом в коде, который вы хотели бы написать против него:

Мне...

spouse.children = person.children...

намного лучше семантически, чем ...

for child in person:
    spouse.addChild(person.child)

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

<_listSomeName>
  <_listItem>...</_listItem>
  <_listItem>...</_listItem>
  <_listItem>...</_listItem>
  <_listItem>...</_listItem>
  <_listItem>...</_listItem>
</_listSomeName>

Давайте проанализируем это:

  1. Элемент-оболочка <_listSomeName> необходим, потому что у нас может быть два или более списков в качестве дочерних элементов элемента и мы должны иметь возможность однозначно и удобно идентифицировать каждый список. Часть SomeName служит для того, чтобы имя списка было уникальным.

  2. Элемент <_listItem> необходим для обертывания каждого отдельного элемента списка. Его нельзя пропустить, потому что элемент списка может иметь сложную структуру (например, являться самим фрагментом xml), и его будет сложно идентифицировать как единое целое.

Я бы использовал первое решение. Список имеет семантическую релевантность: это набор схожих элементов, и поэтому он должен быть идентифицирован как таковой. Во втором решении список не существует как элемент.

Другие вопросы по теме