PHP Conference Japan 2024

SimpleXMLElement::registerXPathNamespace

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SimpleXMLElement::registerXPathNamespace 为下一个 XPath 查询创建前缀/ns 上下文

描述

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

为下一个 XPath 查询创建前缀/ns 上下文。特别是,如果给定 XML 文档的提供者更改了命名空间前缀,这将非常有用。registerXPathNamespace 将为关联的命名空间创建一个前缀,允许访问该命名空间中的节点,而无需更改代码以允许提供者指定的新的前缀。

参数

prefix

在 XPath 查询中用于 namespace 中给出的命名空间的命名空间前缀。

namespace

用于 XPath 查询的命名空间。这必须与 XML 文档中使用的命名空间匹配,否则使用 prefix 的 XPath 查询将不会返回任何结果。

返回值

成功时返回 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 可以避免即使提供者更改了命名空间前缀也需要将来修改查询。

参见

添加注释

用户贡献的注释 1 条注释

Lea Hayes
13 年前
看起来在使用 XPath 时,您必须对每个节点使用 registerXPathNamespace

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

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

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

// 没有以下行则会中断:

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

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