Это действительный XML? - PullRequest
2 голосов
/ 18 декабря 2009

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

<parent>
    <name>John</name>
    <child>Mary</child>
    <child>Lucy</child>
    <child>Hannah</child>
</parent>

или правильный способ сделать это:

<parent>
    <name>John</name>
    <child>
        <name>Mary</name>
    </child>
    <child>
        <name>Lucy</name>
    </child>
    <child>
        <name>Hannah</name>
    </child>
</parent>

Есть ли в Интернете какой-нибудь документ, в котором определенно говорится, что правильно и что неправильно?

Ответы [ 10 ]

15 голосов
/ 18 декабря 2009

Я предпочитаю последнее, так как оно ясно дает понять, что это ИМЯ ребенка - Мария, а не то, что СЕБЕ РЕБЕНОК - Мария.

Я думаю, что использование атрибутов еще лучше, например:

<parent name="John">
    <child name="Mary" />
    <child name="Lucy" />
    <child name="Hannah" />
</parent>

, потому что это дает понять, что имя является просто характеристикой родительского / дочернего объекта.

6 голосов
/ 18 декабря 2009

Второй, похоже, имеет больше смысла с точки зрения расширяемости. Что произойдет, если вам нужно добавить день рождения ребенка в первый? Да, вы можете добавить атрибут XML, но рано или поздно вы застрянете при добавлении к нему сложного типа или даже базового перечисления.

Также - может быть лучше сгруппировать дочерние элементы под один элемент 'children':

<parent>
    <name>John</name>
    <children>
      <child>
        <name>Mary</name>
        <dob>1970-01-01</dob>
      </child>
      <child>
        <name>Lucy</name>
        <dob>1971-01-01</dob>
      </child>
      <child>
        <name>Hannah</name>
        <dob>1974-01-01</dob>
      </child>
    <children>
</parent>

Еще одна вещь: вы, вероятно, не сгруппировали бы детей под одним родительским элементом, но я оставил это в соответствии с вашим оригиналом.

5 голосов
/ 18 декабря 2009

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

2 голосов
/ 18 декабря 2009

Я бы использовал альтернативу между Шоко и ДанДаном или Вимом Холлебрандсом:

<parent name="John">
  <children>
    <child name="Mary" />
    <child name="Lucy" />
    <child name="Hannah" />
  </children>
</parent>

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

2 голосов
/ 18 декабря 2009

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

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

2 голосов
/ 18 декабря 2009

Второе предпочтительнее. Это дает понять, что name является свойством ребенка и не идентифицирует самого ребенка.

Думайте об этом с точки зрения классов:

Это

class Parent {
    string Name;
    List<Child> Children;
}

class Child {
    string Name;
}

предпочтительнее

class Parent {
    string Name; 
    List<string> Children;
}

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

Более субъективный вопрос - использовать ли элементы или атрибуты для таких свойств, как name и т. Д.

Наконец, добавьте элемент children с содержащимися в нем элементами child.

1 голос
/ 18 декабря 2009

Стоит отметить, что термин «действительный» имеет особое значение в XML.

Документ XML действителен тогда и только тогда, когда он соответствует его DTD или схеме. По сути, совокупность текстовых строк делится на две категории: те, которые являются правильно сформированным XML, и те, которые не являются таковыми. Совокупность правильно сформированных XML-документов также делится на три категории: действительные XML-документы (которые соответствуют их DTD / схеме), недействительные XML-документы (которые не соответствуют) и те, чья действительность не может быть определена (поскольку они не DTD / схема).

Что касается вашего реального вопроса, вы можете судить о дизайне XML-документа только на основании его соответствия цели, для которой он будет использоваться. Собираетесь ли вы преобразовать его с помощью XSLT? Запрашиваете это с XPath? Обрабатывать его с помощью Linq-to-XML? Обрабатывать его с помощью SAX-ридера? Десериализация данных в нем в объекты? Редактировать это в блокноте? Проверка его по схеме? Транспортировка по медленной сети? Все эти вещи (и их много) должны влиять на дизайн вашего XML. Правильного ответа не существует.

1 голос
/ 18 декабря 2009

Стандартов для сопоставления данных с XML-схемой не существует. Существует несколько распространенных практик, одним из которых является использование чередующегося XML , поэтому вложенный элемент поочередно принимает роли типа / отношения / типа / отношения:

<!-- striped style, RDF etc -->
<person>
    <name>John</name>
    <children>
        <person>
            <name>Mary</name>
        </person>
        <person>
            <name>Lucy</name>
        </person>
        <person>
            <name>Hannah</name>
        </person>
    <children>
</parent>

Это очень регулярно, но несколько более многословно.

Обычно плохая идея помещать читаемый человеком текст в атрибуты для экономии места:

<person name="fred"/>

Поскольку это исключает использование ruby ​​markup , которое необходимо для некоторых форм интернационализации, а также является более сложным для визуализации с использованием CSS. Если вас интересует только компактное представление и текст ASCII, XML может быть не лучшим форматом для работы.

1 голос
/ 18 декабря 2009

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

Некоторые люди пытаются минимизировать количество узлов. И эти люди, возможно, создадут xml вроде

<parent name="John">
    <child name="Mary" />
    <child name="Lucy" />
    <child name="Hannah" />
</parent>

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

1 голос
/ 18 декабря 2009

Это XML, нет правильного или неправильного. Оба ваших ответа верны, однако это в равной степени верно:

<parent>
  <name>John</name>
  <children>
    <child>Mary</child>
    <child>Lucy</child>
    <child>Hannah</child>
  </children>
</parent>

Какой путь выбрать? Это зависит от задачи. Я не думаю, что какой-либо из представленных способов является наиболее гибким (что если у детей есть дети?)

...