Подтвердить что ты не робот

Самозакрывающиеся теги в файлах XML

<tag id="foo" />

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

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

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

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

4b9b3361

Ответ 1

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

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

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

но также

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

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

<!ELEMENT img EMPTY>

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

<img/>

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

<img></img>

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

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

Да, это не так просто, как кажется сначала.

Различия в XSD:

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

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

Различия в JAXB:

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

  • для String это будет "
  • для Integer это будет 0.
  • для других типов, он просто пропустит это.

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

HTML:

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

Угловой 2+:

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

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

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

Ответ 6

Это зависит от вашей среды и данных. В НЕКОТОРЫХ системах существует разница между пустой строкой и пустой строкой. То есть тип строки, который является "Nothing", сильно отличается от существующей строки, но содержит нулевые символы.

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

null = "<mystring />"

empty = "<mystring></mystring>"

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