Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php XML命名空间前缀冲突的XPath行为_Php_Xml_Dom_Xpath - Fatal编程技术网

Php XML命名空间前缀冲突的XPath行为

Php XML命名空间前缀冲突的XPath行为,php,xml,dom,xpath,Php,Xml,Dom,Xpath,考虑以下XML: 教父 拯救大兵瑞恩 护戒使者 下面的代码将与教父和拯救列兵Ryan匹配。但是为什么呢?我以为它会失败。查询似乎忽略了名称空间名称(URI),而选择了名称空间前缀 $xpath=newdomxpath($dom); $xpath->registerNamespace('en','http://complete-nonsense'); $elements=$xpath->query(“//en:movie”); 我原以为下面的代码与魔戒团契相匹配,但又与教父相匹配,与拯救列兵

考虑以下XML:


教父
拯救大兵瑞恩
护戒使者
下面的代码将与教父拯救列兵Ryan匹配。但是为什么呢?我以为它会失败。查询似乎忽略了名称空间名称(URI),而选择了名称空间前缀

$xpath=newdomxpath($dom);
$xpath->registerNamespace('en','http://complete-nonsense');
$elements=$xpath->query(“//en:movie”);
我原以为下面的代码与魔戒团契相匹配,但又与教父相匹配,与拯救列兵瑞恩相匹配

$xpath=newdomxpath($dom);
$xpath->registerNamespace('en','http://english.com/');
$elements=$xpath->query(“//en:movie”);
只是现在URI似乎有什么不同,现在它与戒指的团契相匹配

$xpath=newdomxpath($dom);
$xpath->registerNamespace('english','http://english.com/');
$elements=$xpath->query(//english:movie”);
为什么呢?PHP的实现有什么问题吗?

DOMXpath::evaluate()
/
DOMXpath::query()
在手动注册的名称空间定义之上注册当前上下文节点的名称空间定义。基本上,文档将覆盖前缀的名称空间。第三个参数(因为PHP>=5.3.3)可以禁用自动注册:

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('en', 'http://english.com/');

// the xmlns:en from the document element overrides the registration
var_dump($xpath->evaluate('normalize-space(//en:movie)'));
// automatic registration disabled - works correctly
var_dump($xpath->evaluate('normalize-space(//en:movie)', NULL, FALSE));
输出:

string(13) "The Godfather"
string(26) "The Fellowship of the Ring"

,为了方便起见,这个特定的实现可能会使用输入文档中的前缀重新声明名称空间。这似乎。。。古怪的我希望永远不会遇到由多个xml树组成的文档,它们恰好共享一个或两个前缀。那会很烦人