我正在使用类似于的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"]/..'