Самозакрывающиеся теги в файлах XML - PullRequest
22 голосов
/ 29 августа 2011

<tag id="foo" />

Я заметил, что они работают с PHP SimpleXML.

Но все примеры XML, которые я нашел в Интернете, закрывают их по-старому:

<tag id="foo"></tag>

Есть ли причина, по которой я должен использовать старый метод?

Ответы [ 6 ]

25 голосов
/ 29 августа 2011

См. Спецификации W3C для XML и XHTML:

Это зависит от объявления типа элемента

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

но также

Теги пустого элемента могут использоваться для любого элемента, у которого нет содержимого, независимо от того, объявлено ли оно с использованием ключевого слова EMPTY. Для обеспечения совместимости ДОЛЖЕН использоваться тег пустого элемента, и ДОЛЖЕН использоваться только тот элемент, который объявлен как EMPTY.

Это означает, что когда ваш DTD содержит что-то вроде

<!ELEMENT img EMPTY>

Вы должны использовать

<img/>

, если у вас нет веских оснований для использования

<img></img>

Обратите внимание, что СЛЕДУЕТ определять в RFC2119 как

Это слово или прилагательное "РЕКОМЕНДУЕТСЯ" означают, что могут существовать веские причины в определенных обстоятельствах игнорировать конкретный пункт, но все последствия должны быть поняты и тщательно взвесить, прежде чем выбрать другой курс.

Если вы работаете с XML, в котором нет DTD или схемы, вы также можете повлиять на сериализацию XML с помощью предопределенной константы libxml :

LIBXML_NOEMPTYTAG (целое число): развернуть пустые теги (например, <br/> до <br></br>)

Но учтите, что этот параметр в настоящее время доступен только в функциях DOMDocument::save и DOMDocument::saveXML, поэтому его нельзя использовать с SimpleXml.

2 голосов
/ 29 августа 2011

Если вы хотите использовать PHP xml parser , вы можете указать действия для начального тега, закрытого тега или полного тега. Исходя из ваших пожеланий, вы можете захотеть выполнить действие, связанное с тегом закрытия.

1 голос
/ 02 мая 2018

Да, это не так просто, как кажется на первый взгляд.

XSD различия:

Прежде всего, это зависит от вашего типа данных. Если вы используете определение схемы XSD, которое определяет типы ваших элементов, то <element></element> может фактически использоваться только для строковых типов . Потому что это то, что на самом деле является пустым строковым значением: "".

Поэтому нельзя использовать <element></element> для целого числа, тогда как <element/> применимо для всех простых типов.

Различия JAXB:

JAXB (Java XML Binding) имеет подобные причуды. Было бы отображено <element/> как различных значений в зависимости от целевого типа данных :

  • для строки, это будет ""
  • для целых чисел, это будет 0.
  • для других типов, он просто пропустил бы это.

Вы могли бы подумать, что <element/> разрешит значение null. Но вам на самом деле нужно использовать <element xsi:nil="true"/> для этого. Что я никогда не видел на практике.

HTML:

В HTML всегда есть третий вариант <element> без закрывающего тега . Я не знаю как вы, но несколько раз в день я должен напоминать себе, что HTML - это не только XML. И это на самом деле означает, что <br> и <br/> не одно и то же. Вы не должны использовать <br/> в HTML, и вы не должны использовать <br> в XHTML.

Угловой 2 +:

Но то, что я действительно хотел получить, продолжая в последнем утверждении, если вы используете фреймворки, такие как Angular2 +, есть еще одна вещь, которую нужно иметь в виду.

Не вдаваясь в подробности, Angular заменяет пользовательские теги HTML шаблонами HTML, которые связаны с компонентами. Однако поддерживает только формат <element></element> . Вам не разрешено использовать формат <element/>.

Я лично стараюсь избегать синтаксиса <element/>, потому что у него есть весь потенциал, чтобы что-то пошло не так. (= плохой аджи ).

1 голос
/ 29 августа 2011

Они одинаковы для XML, но могут отличаться в зависимости от вашего использования.Например, в xhtml1.0 есть официальный список для тегов, разрешенных для самозакрытия.До тех пор, пока вы сохраните правильный тип документа в формате xhtml, все будет в порядке.Проверьте этот вопрос stackoverflow для более подробного объяснения.

1 голос
/ 29 августа 2011

В некоторых случаях необходимы отдельные теги открытия / закрытия: в качестве примера я обнаружил, что теги в HTML должны иметь отдельные теги открытия / закрытия для согласованной работы в некоторых браузерах.Отдельное открытие / закрытие немного более многословно, но оно того стоит.

0 голосов
/ 29 августа 2011

Это зависит от вашей среды и данных. В SOME системах существует разница между пустой строкой и пустой строкой. То есть строковый тип «Nothing» очень отличается от строки, которая фактически существует, но содержит ноль символов.

Они могут быть представлены в XML как:

null = "<mystring />"

empty = "<mystring></mystring>"

9 раз из 10, это не имеет большого значения, но бывают случаи, когда разница между отсутствием данных и пустыми данными на самом деле очень значительна («пока не знаю» против «I» узнал, и там было пусто. ")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...