SunshinePHP 2019 CFP Started

SimpleXMLElement::registerXPathNamespace

(PHP 5 >= 5.1.0, PHP 7)

SimpleXMLElement::registerXPathNamespace Создает префикс/пространство имен контекста для следующего запроса XPath

Описание

public bool SimpleXMLElement::registerXPathNamespace ( string $prefix , string $ns )

Создает префикс/пространство имен контекста для следующего запроса XPath. В частности это необходимо, если поставщик данного XML-документа изменяет префикс пространства имен. registerXPathNamespace создаст префикс для связанного пространства имен, позволяя получить доступ к узлам в этом пространстве имен без необходимости изменения кода, учитывающего новые префиксы, предоставленные поставщиком.

Список параметров

prefix

Префикс используемого пространства имен в запросе XPath для получения пространства имен в ns.

ns

Используемое пространство имен для запроса XPath. Оно должно соответствовать пространству имен в используемом XML-документе или запрос XPath, использующий prefix не даст никаких результатов.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Примеры

Пример #1 Установка префикса пространства имен для использования в запросе XPath

<?php

$xml 
= <<<EOD
<book xmlns:chap="http://example.org/chapter-title">
    <title>My Book</title>
    <chapter id="1">
        <chap:title>Chapter 1</chap:title>
        <para>Donec velit. Nullam eget tellus vitae tortor gravida scelerisque.
            In orci lorem, cursus imperdiet, ultricies non, hendrerit et, orci.
            Nulla facilisi. Nullam velit nisl, laoreet id, condimentum ut,
            ultricies id, mauris.</para>
    </chapter>
    <chapter id="2">
        <chap:title>Chapter 2</chap:title>
        <para>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin
            gravida. Phasellus tincidunt massa vel urna. Proin adipiscing quam
            vitae odio. Sed dictum. Ut tincidunt lorem ac lorem. Duis eros
            tellus, pharetra id, faucibus eu, dapibus dictum, odio.</para>
    </chapter>
</book>
EOD;

$sxe = new SimpleXMLElement($xml);

$sxe->registerXPathNamespace('c''http://example.org/chapter-title');
$result $sxe->xpath('//c:title');

foreach (
$result as $title) {
  echo 
$title "\n";
}

?>

Результат выполнения данного примера:

Chapter 1
Chapter 2

Обратите внимание, на то, как в примере XML-документу устанавливается пространство имен с префиксом chap. Представьте, что этот документ (или другой похожий) использовал префикс c в прошлом для одного и того же пространства имен. Так как он изменился, запрос XPath больше не вернет правильных результатов, и запрос придется изменять. Использование registerXPathNamespace позволяет избежать будущих модификаций запросов, даже если поставщик изменит префикс пространства имен.

Смотрите также

add a note add a note

User Contributed Notes 1 note

up
0
Lea Hayes
7 years ago
Looks like you have to use registerXPathNamespace for each node when using XPath:

<?php
$xml
= simplexml_load_file($filename);

$xml->registerXPathNamespace('test', 'http://example.com');

$shopping_element = $xml->xpath('test:shopping-list');

// Breaks with out the following line:

$shopping_element->registerXPathNamespace('test', 'http://example.com');

$fruit = $shopping_element->xpath('test:fruit');
?>
To Top