我有一个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>&nbsp;</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。请注意,否则您将根本不会进行任何搜索。

07-28 00:45
查看更多