1

我正在使用 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-request 中时,它也可以正常工作,但是当我使用$attributeQuery-variable时$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某种方式神奇地逃脱了。

尽管目前一切正常,但有人可以解释为什么会这样吗?

4

1 回答 1

2

来自php.net 评论

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

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

所以对于你的(我猜评论中的转义字符顺序错误):

$xml->path('///Region[@country=concat("Lao People", '\'', "s Democratic Republic"]/..'
于 2012-09-10T14:44:42.767 回答