我有一个XML文档:
<items>
<item>
<id>1</id>
<title>Title ABC Defg</title>
<author>Author Name</author>
<description>Description text </description>
</item>
...
</items>
我想进行一下搜索并检查标题,作者,描述是否包含短语
我不知道如何立即执行并按相关性排序。但这并不像搜索“单词”和“单词”那么重要。我使用了php代码:
<?php
$xml=simplexml_load_file(file.xml);
$query=$_GET['query'];
$nodes= $xml->xpath("//item[contains(title,'$query')]");
$count = count($nodes);
for ($i=1;$i<=$count;$i++){
$nodes= $xml->xpath("//item[contains(title,'$query')][$i]");
foreach($nodes as $node) {
$title = $node->title;
$desc= $node->description;
$auth= $node->auth;
$id= $node->id;
echo "id: $id<br />title: $title<br />author: $auth<br />desc: $desc<p> </p>
?>
我知道它仅搜索标题,但问题是当我搜索Word时找不到单词,并且我想同时获取:单词和Word
如果您还可以通过作者姓名和描述中的“连接”搜索来帮助我,并以某种方式对其进行排序,我将非常适合。
编辑:
我设法搜索了所有标签(不仅指定了标签,但对我来说也可以)
所以我有这样的代码:
$query=strtolower(rawurldecode($_GET['s']));
$nodes= $xml->xpath("//item[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'$query')]") // . - all i suppose
我也使用$ query的验证
最佳答案
因此,您想知道如何选择<items><item>
元素的所有子元素,这些元素包含使用xpath搜索的文本(我不区分大小写,您可以在链接的答案中找到)。首先,所有项目元素:
//items/item
您已经拥有了。要仅返回包含某些文本的内容,请添加谓词:
//items/item[contains(., 'XYZ')]
如果只想在
<title>
子元素内搜索://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 ...
您可以通过执行as outline here来防止出现这种情况,特别是将值分配给文档并与之进行比较:
$query = 'd\'oh';
$xml['query'] = $query;
$nodes = $xml->xpath("//item[contains(title, /*/@query)]");
旧:您一次提出多个问题:
如何使用不区分大小写的xpath搜索
如何找出相关性(因此按相关性排序)
相关性未定义。与某人相关的内容可能与其他人无关,因此,如果不对如何衡量相关性进行具体定义,就很难回答您的那部分问题。
对于不区分大小写的搜索,已经链接了重复的问题,因此您应该可以这样做。在我眼中最好的第一个骗子:
case insensitive xpath searching in php
但是,在这里也仍然不确定大小写是什么情况。您尚未指定任何内容,因此无法真正回答您的问题。
另外,您实际上并没有验证您的输入:
$query = $_GET['query'];
$nodes = $xml->xpath("//item[contains(title,'$query')]");
可以在此处使用GET参数注入xpath。请注意,否则您将根本不会进行任何搜索。