Какие DOMNodes могут быть представлены SimpleXMLElement?
Самое большое различие между двумя библиотеками заключается в том, что SimpleXML в основном представляет собой один класс: SimpleXMLElement
.Напротив, расширение DOM имеет много классов, большинство из которых являются подтипом DOMNode
.
Таким образом, один основной вопрос при сравнении этих двух библиотек состоит в том, какой из множества классов, предлагаемых DOM, может быть представлен SimpleXMLElement
в конце?
Ниже приведена таблица сравнения, содержащая те типы DOMNode
, которые действительно полезны при работе с XML (полезные типы узлов).Ваш пробег может варьироваться, например, когда вам нужно иметь дело с DTD, например:
+-------------------------+----+--------------------------+-----------+
| LIBXML Constant | # | DOMNode Classname | SimpleXML |
+-------------------------+----+--------------------------+-----------+
| XML_ELEMENT_NODE | 1 | DOMElement | yes |
| XML_ATTRIBUTE_NODE | 2 | DOMAttr | yes |
| XML_TEXT_NODE | 3 | DOMText | no [1] |
| XML_CDATA_SECTION_NODE | 4 | DOMCharacterData | no [2] |
| XML_PI_NODE | 7 | DOMProcessingInstruction | no |
| XML_COMMENT_NODE | 8 | DOMComment | no |
| XML_DOCUMENT_NODE | 9 | DOMDocument | no |
| XML_DOCUMENT_FRAG_NODE | 11 | DOMDocumentFragment | no |
+-------------------------+----+--------------------------+-----------+
[1]
: SimpleXML абстрагирует текстовые узлы как строковое значение элемента (сравните __toString
).Это работает только тогда, когда элемент содержит только текст, в противном случае текстовая информация может быть потеряна. [2]
: каждый XML-парсер может расширять узлы CDATA при загрузке документа.SimpleXML расширяет их, когда опция LIBXML_NOCDATA
используется с simplexml_load_*
функциями или конструктором .(Опция работает также с DOMDocument::loadXML()
)
Как показывает эта таблица, SimpleXML имеет действительно ограниченные интерфейсы по сравнению с DOM.Рядом с теми, что в таблице, SimpleXMLElement
также абстрагирует доступ к дочерним элементам и спискам атрибутов, а также обеспечивает обход через имена элементов (доступ к свойствам), атрибуты (доступ к массивам), а также является Traversable
повторение своих "собственных" дочерних элементов (элементов или атрибутов) и предоставление доступа к пространству имен с помощью методов children()
и attributes()
.
Пока все эти магические интерфейсы хороши, однако их нельзя изменитьрасширяя от SimpleXMLElement, так волшебство, как оно есть, настолько же ограничено, насколько это возможно.
Чтобы узнать, какой тип узла представляет объект SimpleXMLElement, см .:
Здесь DOM следует спецификации DOMDocument Core Level 1 .С этим интерфейсом вы можете выполнять практически все возможные операции с XML.Однако это только уровень 1, поэтому по сравнению с современными уровнями DOMDocument, такими как 3, он несколько ограничен для некоторых более интересных вещей.Конечно, SimpleXML и здесь проиграл.
SimpleXMLElement позволяет приводить к подтипам.Это очень особенное в PHP.DOM также допускает это, хотя это немного больше работы, и нужно выбрать более конкретный тип узла.
XPath 1.0 поддерживается обоими, результат в SimpleXML - array
из SimpleXMLElements
, в DOM DOMNodelist
.
SimpleXMLElement
поддерживает приведение к строке и массиву (json), классы DOMNode в DOM - нет.Они предлагают приведение к массиву, но только так, как это делает любой другой объект (публичные свойства в качестве ключей / значений).
Общие шаблоны использования этих двух расширений в PHP:
- Обычно выначать использовать SimpleXMLElement.Ваш уровень знаний об XML и XPath находится на одинаково низком уровне.
- После борьбы с магией его интерфейсов, определенный уровень разочарования рано или поздно достигается.
- Вы обнаружите, что можете импортировать
SimpleXMLElement
s в DOM и наоборот.Вы узнаете больше о DOM и о том, как использовать расширение для выполнения действий, которые вы не смогли (или не смогли выяснить, как) сделать с SimpleXMLElement
. - . Вы заметили, что можете загружать документы HTML с помощьюРасширение DOM.И неверный XML.И сделать выходное форматирование.Вещи, которые SimpleXMLElement просто не может сделать.Даже с грязными трюками.
- Вы, вероятно, даже полностью переключитесь на расширение DOM, потому что, по крайней мере, вы знаете, что интерфейс более дифференцирован и позволяет вам что-то делать.Также вы видите выгоду в изучении DOM Level 1, потому что вы можете использовать его также в Javascript и других языках (огромное преимущество расширения DOM для многих).
Вы можете повеселиться с обоими расширениями, и я думаю, вы должны знать оба. Чем больше, тем лучше. Все расширения на основе libxml в PHP являются очень хорошими и мощными расширениями. А в Stackoverflow под тегом php есть хорошая традиция хорошо освещать эти библиотеки, а также подробную информацию.