正在逃避SimpleXML XPath查询中的问题


Escaping problems in SimpleXML XPath query

我正在使用类似于的XPath从PHP中的XML文件中检索数据

$xml -> xpath('///Region[@country="Spain"]/..');

这很好用。现在我正在从AJAX请求构建属性查询,比如:

$attributeQuery = '';
for ($i = 0; $i < count($queryArray); $i++){
    $attributeQuery .= '@'.$keys[$i].'="'.addslashes($values[$i]).'"'; //outputs `@key="value"`
    if ($i + 1 != count($queryArray)){ //string needs another ' and ' if not last element
        $attributeQuery .= ' and ';
    }
}
$path = '///Region['.$attributeQuery.']/..';

当我有标准的一个单词的国家名称时,这很好。当我在寻找包含单引号的名称时,麻烦就开始了,比如:Lao People's Democratic Republic。我的查询构造函数返回:

'///Region[@country="Lao People''s Democratic Republic"]/..'

在这种情况下,当我将其硬编码到xpath请求中时,它也可以正常工作,但当我使用$attributeQuery-变量(如$xml -> xpath($path);)时,它会失败并返回空结果?有问题的节点确实存在于我的XML中(它在硬编码查询中找到…):

...
<Region continent="Asia" country="Lao People's Democratic Republic" state="" subcontinent="South-Eastern Asia" />
...

老实说,我有点困惑可能是什么原因造成的,我想这是一些逃避的问题,但我不知道它是从哪里来的。我也不明白为什么硬编码的字符串可以工作,而使用变量则不行?关于addslashes的内部工作原理,我在这里遗漏了什么吗?

编辑:

因此,我发现从查询字符串连接中删除addslashes可以解决我的问题,因为$_GET中的值似乎已经转义了。奇怪的是,我确实关闭了Magic Quotes(在运行时检查它也返回了0),从文档中可以看到,我的字符串唯一应该发生的事情是,它们在发送到客户端之前由jQuery进行URL编码,在处理服务器端之前进行URL解码。

所以现在发生的事情如下,我在JS中这样做:

params.country = $(this).val(); //returns "Lao People's Democratic Republic"
$.getJSON('getMapData.php',params,function(data){...

服务器正在执行以下操作:

$vals = array_values($_GET);
$keys = array_keys($_GET);

$vals中的值已经神奇地逃脱了。

尽管目前情况良好,但有人能解释为什么会发生这种情况吗?

来自php.net评论:

如果要搜索带引号的值,请使用xpath-concat函数。

$xml->xpath('//zone[@country=concat("Cote d", '''', "Ivoire")]'); 

因此,对于您的(我猜注释中的转义符顺序错误):

$xml->path('///Region[@country=concat("Lao People", '''', "s Democratic Republic"]/..'