getNamespaces()
Узнайте, как getNamespaces() в PHP возвращает пространства имён XML-элемента, синтаксис, пример и отличие от getDocNamespaces().
Введение
SimpleXML — расширение PHP, предоставляющее простой объектно-ориентированный API для чтения XML-документов. Когда XML-документ использует пространства имён — например <bk:title>, где bk привязан к URI, — часто нужно знать, какие пространства имён объявляет или наследует конкретный элемент. Метод SimpleXMLElement::getNamespaces() отвечает именно на этот вопрос: он возвращает пространства имён, которые находятся в области видимости для элемента. В этой статье объясняется его синтаксис, приводится рабочий пример и разъясняется отличие от тесно связанного метода getDocNamespaces().
Функция SimpleXMLElement::getNamespaces()
getNamespaces() возвращает ассоциативный array пространств имён, используемых в элементе — то есть префиксы (и пространство имён по умолчанию, ключом которого служит пустая string), действительно применяемые к узлу и, при необходимости, к его потомкам. Синтаксис соответствует официальному формату руководства PHP:
SimpleXMLElement::getNamespaces ( bool $recursive = false ) : arrayЗдесь $recursive является необязательным. Если оставить значение по умолчанию false, метод сообщает только о пространствах имён, используемых на текущем элементе. При значении true метод также обходит дочерние элементы и включает все пространства имён, которые они используют. Возвращаемый array сопоставляет каждый префикс с его namespace URI.
Стоит сравнить два похожих метода:
getNamespaces()возвращает пространства имён, которые фактически используются элементом (и, при необходимости, его потомками).getDocNamespaces()возвращает каждое пространство имён, объявленное в документе, независимо от того, используется оно или нет.
Пример использования
Рассмотрим пример, чтобы понять, как работает SimpleXMLElement::getNamespaces() в PHP:
В приведённом примере мы создаём SimpleXMLElement из элемента <book>, дочерний элемент <bk:title> которого использует пространство имён bk, привязанное к https://example.com/books. Передача true в getNamespaces() заставляет метод рекурсивно обходить дочерние элементы, поэтому пространство имён bk, используемое элементом <bk:title>, включается в результат. Затем мы перебираем возвращаемый array и выводим каждый префикс вместе с его URI. Результат:
Prefix: bk, URI: https://example.com/booksЕсли бы вместо этого мы вызвали getNamespaces(false), array оказался бы пустым, поскольку корневой элемент <book> сам по себе не использует префикс bk — только его дочерний элемент.
Заключение
Метод SimpleXMLElement::getNamespaces() — это узкоспециализированный инструмент для обнаружения пространств имён, которые фактически находятся в области видимости для элемента. Используйте его (с $recursive = true), когда вам нужны пространства имён, на которые опираются элемент и его потомки, а для получения всех пространств имён, объявленных в документе, обращайтесь к getDocNamespaces(). Чтобы узнать, как запрашивать узлы с пространствами имён, зная их префиксы, см. registerXPathNamespace().