DOMXPath::registerNamespace

(PHP 5, PHP 7, PHP 8)

DOMXPath::registerNamespaceDOMXPath 对象中注册命名空间

说明

public DOMXPath::registerNamespace(string $prefix, string $namespace): bool

在 DOMXPath 对象中注册 namespaceprefix

参数

prefix

前缀。

namespace

命名空间的 URI。

返回值

成功时返回 true,失败时返回 false

添加笔记

用户贡献笔记 6 条笔记

spam at spam dot spam
19 年前
在网上的一些地方提到了,但这里没有提到。您需要使用此函数为文档的默认命名空间设置前缀。

例如,如果您尝试解析 Microsoft Spreadsheet XML 文件,该文件具有 "urn:schemas-microsoft-com:office:spreadsheet" 的默认命名空间

$doc = DOMDocument::load("my_spreadsheet.xml);
$xpath = new DOMXPath($doc);
$xpath->registerNamespace("m",
"urn:schemas-microsoft-com:office:spreadsheet");
$query = '/m:Workbook/m:Worksheet[1]/m:Table';
$result = $xpath->query($query, $doc);

您可以使用任何东西代替 "m",但您必须指定一些东西!仅仅要求 "/Workbook/Worksheet/Table" 不起作用。
cameron kellough
17 年前
这称为前缀映射,它对于使用 xpath 处理具有默认命名空间的文档是必要的。//root/item 将搜索没有命名空间的项目,而不是搜索在 xmlns 声明中作为默认值描述的命名空间的项目。这个问题让人抓狂,因为它表面上看起来 xpath 根本不起作用。
dulao5 at gmail dot com
15 年前
以下代码可以用于 XML 默认命名空间。
<?php
$xml
= <<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:other="http://other.w3.org/other" >
<id>uYG7-sPwjFg</id>
<published>2009-05-17T18:29:31.000Z</published>
</entry>
EOT;

$doc = new DOMDocument;
$doc->loadXML($xml);
$xpath = DOMXPath($doc);

$xpath->registerNamespace('atom', "http://www.w3.org/2005/Atom");

$xpath_str = '//atom:entry/atom:published/text()';

$entries = $xpath->evaluate($xpath_str);

print
$entries->item(0)->nodeValue ."\n";

?>
igor dot pellegrini at diespam-berlinonline dot de
9 年前
文档不够详细。
可能有人也对取消注册命名空间的可能性感兴趣。

值得注意的是原始的 libxml 函数 "xmlXPathRegisterNs()"

* 对于参数 "$prefix" 不接受 NULL 或空字符串。

以及

* 如果 "$namespaceURI" 参数为 NULL,则取消注册命名空间。

这里有文档
http://xmlsoft.org/html/libxml-xpathInternals.html#xmlXPathRegisterNs
xmedeko at gmail dot com
12 年前
注册根默认命名空间的一种通用方法

<?php
$xml
= new DomDocument();
$xml->load('data.xml');
$xpath = new DOMXPath($xml);
$rootNamespace = $xml->lookupNamespaceUri($xml->namespaceURI);
$xpath->registerNamespace('x', $rootNamespace);
?>

然后只需查询

<?php $elementList = $xpath->query('//x:items/x:name'); ?>
agent009
15 年前
好的,这里有一个函数使用以下特殊字符扩展了 XPath 语法

~ 如果定义了默认命名空间前缀,则插入默认命名空间前缀

# text() 的简写

% comment() 的简写

$ node() 的简写

?* processing-instruction() 的简写

?foo processing-instruction("foo") 的简写

? processing-instruction("") 的简写

^ 转义后面的字符(使用文字或 SGML 实体,根据需要)

除了 ^ 之外,所有这些在引号字符串中都会被忽略

<?php
function extendXPath($str, $defns = NULL) {
$quote = false;
$map = array(
'~' => isset($defns) ? "$defns:" : '',
'#' => 'text()',
'%' => 'comment()',
'$' => 'node()'
);
$out = '';

for (
$i = 0, $len = strlen($str); $i < $len; $i++) {
$c = $str[$i];
if (!
$quote && array_key_exists($c, $map)) {
$out .= $map[$c];
} else switch (
$c) {
case
'^':
$out .= htmlspecialchars($str[++$i], ENT_QUOTES);
break;
case
'?':
if (
$quote) {
$out .= $c;
} elseif (
$str[$i + 1] == '*') {
$out .= 'processing-instruction()';
$i++;
} else {
preg_match('/^\w+/', substr($str, $i + 1), $matches);
$out .= 'processing-instruction("'.$matches[0].'")';
$i += strlen($matches[0]);
};
break;
case
'"':
$quote = !$quote;
default:
$out .= $c;
};
};

return
$out;
}
?>
To Top