Лучшие практики: атрибут XML по сравнению с элементом XML - Когда я должен использовать элементы и когда я должен использовать атрибуты? [дубликат]

Ошибка анализа: синтаксическая ошибка, неожиданная '['

Эта ошибка возникает в двух вариантах:

Вариант 1

$arr = [1, 2, 3];

Синтаксис инициализатора этого массива был введен только в PHP 5.4; это приведет к возникновению ошибки парсера в версиях до этого. Если возможно, обновите свою установку или используйте старый синтаксис:

$arr = array(1, 2, 3);

См. Также этот пример из руководства.

Вариант 2

$suffix = explode(',', 'foo,bar')[1];

Результаты функции разыменования массива также были введены в PHP 5.4. Если обновление невозможно, вам нужно использовать временную переменную:

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

См. Также этот пример из руководства.

23
задан Rob 6 August 2016 в 19:07
поделиться

10 ответов

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

  • может быть только один экземпляр атрибута, хотя можно осуществить это с элементами с помощью DTD или XML-схемы;
  • Атрибуты не заказаны. Элементы не;
  • Атрибуты приводят к более краткому синтаксису, при отсутствии детей. Сравните:

    < название страницы = "Карта сайта"/>

к:

<page>
  <name>Sitemap</name>
</page>

я знаю, какой я предпочитаю;

  • Едва ли релевантный теперь, так как ДАТЫ не используются очень (если вообще) по XML-схеме, но я добавлю его так или иначе: ДАТЫ позволяют значения по умолчанию (подразумеваемые) для атрибутов, но никакого такого механизма для элементов; и
  • Элементы, будучи элементами, могут иметь детей и собственные атрибуты. Атрибуты, очевидно, не могут.

Так, от Вашего примера, Ваше самое внутреннее <page> элемент имеет атрибут URL (хотя это - изображение по некоторым причинам - возможно, значок предварительного просмотра? Раз так название атрибута вводит в заблуждение). Веб-страница только (обычно) имеет один URL, таким образом, это было бы хорошим примером чего-то, что могло быть атрибутом.

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

, Но, в конце, большую часть времени нет никакого права, или неправильно ответьте, и это - в основном вопрос стиля.

20
ответ дан cletus 29 November 2019 в 01:49
поделиться

Два примера не эквивалентны, потому что они образуют разные иерархии. Карта сайта - это список категорий, как в первом примере? Или это список страниц, как во втором примере?

Ответ на этот вопрос ортогонален вопросу «элемент против атрибута».

По вопросу «Элемент против атрибута»: Вот ваш второй пример, преобразованный в подход с использованием атрибутов:

<sitemap>
 <page    
  category='Animals'
  section='Dogs'
  title='Great Dane'
  url='/pics/greatdane.jpg'
  /> 
</sitemap>

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

<sitemap>
 <page>    
  <category>Animals</category>
  <section>Dogs</section>    
  <title>Great Dane</title>    
  <url nofollow="true">/pics/greatdane.jpg</url>
 </page> 
</sitemap>
12
ответ дан Svante 29 November 2019 в 01:49
поделиться

Я думаю, что ответ довольно очевиден, когда Вы думаете о том, как Вы хотите добавить больше собак:

<sitemap>
  <category name="Animals">
    <section title="Dogs">
      <page url="/pics/greatdane.jpg" title="Great Dane"/>
      <page url="/pics/wienerdog.jpg" title="Wiener Dog"/>
    </section>
  </category>
</sitemap>

или

<sitemap>
  <page>
    <category>Animals</category>
    <section>Dogs</section>
    <title>Great Dane</title>
    <url>/pics/greatdane.jpg</url>    
  </page>
  <page>
    <category>Animals</category>
    <section>Dogs</section>
    <title>Wiener Dog</title>
    <url>/pics/wienerdog.jpg</url>
  </page>
</sitemap>
3
ответ дан Svante 29 November 2019 в 01:49
поделиться

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

Одна приятная вещь о первом - это то, что он легко, возможно позже, поддерживает несколько страниц в разделе и несколько разделов в категории. Во втором эта информация распространяется по страницам.

2
ответ дан David Norman 29 November 2019 в 01:49
поделиться

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

В 1, карта сайта инкапсулирует категорию, инкапсулирующую раздел, который инкапсулирует страницу.

В 2, карта сайта инкапсулирует страницу, которая инкапсулирует три объекта: категория, раздел, заголовок и URL. Ни один из этих трех объектов не содержит никакого другого, они - одноуровневые элементы, все обычно сохраненные в странице.

Как две различных структуры, это зависит, на котором Вы предназначили.

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

2
ответ дан Mat 29 November 2019 в 01:49
поделиться

Я использую элементы для данных и атрибуты для метаданных

2
ответ дан Marioh 29 November 2019 в 01:49
поделиться

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

1
ответ дан Otávio Décio 29 November 2019 в 01:49
поделиться

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

1
ответ дан Ryan Taylor 29 November 2019 в 01:49
поделиться

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

<sitemap>
  <category name="Animals">
    <section title="Dogs" status="draft">
      ...
    </section>
  </category>
</sitemap>

делает лучшее задание передачи следующих фактов:

  1. имя является свойством категории
  2. , категория могла иметь несколько разделов
  3. , состояние является свойством раздела; не все разделы в категории требуются, чтобы иметь то же состояние.

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

1
ответ дан joel.neely 29 November 2019 в 01:49
поделиться

Простое практическое правило: если вы можете реализовать структуру данных в виде неупорядоченной карты пар имя / значение, вы можете использовать атрибуты элемента для его представления. Если вы не можете (если, например, у вас будет несколько имен, или у данного имени будет несколько связанных значений, или порядок пар имя / значение является значительным), тогда элемент с атрибутами является неправильным представлением .

Две другие вещи, которые могут сделать это неправильное представление:

  • Значения содержат разметку. Это может быть представлено в значениях атрибута, но это неудобно, потому что все символы разметки должны быть экранированы в сущности. Кроме того, разметка не будет проанализирована.
  • Вы используете проверку XML-схемы, и существует более одного допустимого набора пар имя / значение. XML-схема может определять только один набор допустимых атрибутов для элемента, тогда как она может определять несколько взаимоисключающих наборов допустимых дочерних элементов.

Очевидное преимущество использования атрибутов состоит в том, что они приводят к более резкому XML. Они (очень) немного быстрее разбираются, чем элементы тоже.

1
ответ дан Robert Rossney 29 November 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: