在PHP XPath中搜索XML项
我有一个XML文档:在PHP XPath中搜索XML项,php,xml,search,xpath,Php,Xml,Search,Xpath,我有一个XML文档: <items> <item> <id>1</id> <title>Title ABC Defg</title> <author>Author Name</author> <description>Description text </description> </item>
<items>
<item>
<id>1</id>
<title>Title ABC Defg</title>
<author>Author Name</author>
<description>Description text </description>
</item>
...
</items>
我还使用了$query的一种验证,因此您想知道如何选择包含xpath文本搜索的
元素的所有子元素(我省略了区分大小写,您可以在链接的答案中找到)。首先,所有项目要素:
//items/item
你已经有了。要仅返回包含某些文本的文本,请添加谓词:
//items/item[contains(., 'XYZ')]
如果只想在
子元素中搜索:
//items/item[contains(title, 'XYZ')]
这基本上就是你已经拥有的,但是你让你的生活变得不必要的艰难:你不需要做两次,你可以直接迭代匹配:
$nodes = $xml->xpath("//items/item[contains(title, 'XYZ')]");
foreach ($nodes as $node)
{
foreach ($node as $name => $prop) {
printf("%s: %s\n", $name, $prop);
}
echo "\n";
}
输出:
id: 3
title: Title XYZ
author: Author Name
description: Description text
学习如何逃避输入到XPath(它是只读的,所以这不像SQL注入一样危险),请考虑下面的例子:
$query = 'XYZ';
$expression = sprintf("//item[contains(title,'%s')]", $query);
$nodes = $xml->xpath($expression);
它将创建以下表达式:
//item[contains(title,'XYZ')]
但是,如果其中有某个引用,会发生什么呢?它将终止字符串并因此创建错误:
$query = 'd\'oh';
将提供:
Warning: SimpleXMLElement::xpath(): Invalid expression in ...
您可以通过做一些事情来防止这种情况,特别是将值分配给文档并与之进行比较,然后:
$query = 'd\'oh';
$xml['query'] = $query;
$nodes = $xml->xpath("//item[contains(title, /*/@query)]");
Old:您可以同时问多个问题:
$query = $_GET['query'];
$nodes = $xml->xpath("//item[contains(title,'$query')]");
可以在此处使用GET参数注入xpath。小心,否则您根本不会进行任何搜索。所以您想知道,如何选择包含xpath文本搜索的
元素的所有子元素(我省略了区分大小写,您可以在链接的答案中找到)。首先,所有项目要素:
//items/item
你已经有了。要仅返回包含某些文本的文本,请添加谓词:
//items/item[contains(., 'XYZ')]
如果只想在
子元素中搜索:
//items/item[contains(title, 'XYZ')]
这基本上就是你已经拥有的,但是你让你的生活变得不必要的艰难:你不需要做两次,你可以直接迭代匹配:
$nodes = $xml->xpath("//items/item[contains(title, 'XYZ')]");
foreach ($nodes as $node)
{
foreach ($node as $name => $prop) {
printf("%s: %s\n", $name, $prop);
}
echo "\n";
}
输出:
id: 3
title: Title XYZ
author: Author Name
description: Description text
学习如何逃避输入到XPath(它是只读的,所以这不像SQL注入一样危险),请考虑下面的例子:
$query = 'XYZ';
$expression = sprintf("//item[contains(title,'%s')]", $query);
$nodes = $xml->xpath($expression);
它将创建以下表达式:
//item[contains(title,'XYZ')]
但是,如果其中有某个引用,会发生什么呢?它将终止字符串并因此创建错误:
$query = 'd\'oh';
将提供:
Warning: SimpleXMLElement::xpath(): Invalid expression in ...
您可以通过做一些事情来防止这种情况,特别是将值分配给文档并与之进行比较,然后:
$query = 'd\'oh';
$xml['query'] = $query;
$nodes = $xml->xpath("//item[contains(title, /*/@query)]");
Old:您可以同时问多个问题:
$query = $_GET['query'];
$nodes = $xml->xpath("//item[contains(title,'$query')]");
可以在此处使用GET参数注入xpath。当心,否则,您根本不会进行任何搜索。请参阅phpposible中的伪不区分大小写查询可能与的重复项相同。我强烈建议不要替换XPath表达式框架中的外部字符串——您可能很容易成为XPath注入的牺牲品。请参阅phpposible中的伪不区分大小写查询我强烈建议不要在XPath表达式框架中替换外部字符串——您可能很容易成为XPath注入的受害者。相关性-我明白了-我只想关注不敏感的大小写,我正在研究它-我想用指定的子节点搜索父节点你能告诉我更多吗关于验证输入?我怎样才能防止注射呢?“但是如果有一个单独的引语在里面会发生什么呢?”-只有“和”“会很危险吗?如果是的话,我可以从string@NiedamWam:当然,您也可以删除。我只是举了一个例子,如果你想把它放进去,有些保守:应该能够搜索,所以保持它在里面。相关性-我明白了-我只是想关注不敏感的大小写,我正在研究它-我想搜索带有指定子节点的父节点你能告诉我更多关于验证输入的信息吗?我怎样才能防止注射呢?“但是如果里面只有一句话怎么办?”-只有”和“可能是危险的?如果是这样的话,我可以从列表中删除它们string@NiedamWam:当然,你也可以删除。我只是举了一个例子,如果你想把它放进去,有些保守:应该可以搜索,所以把它放进去。