搜索XML项目PHP XPath

时间:2012-04-15 12:34:09

标签: 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>

我想做一个serching并检查标题,作者,描述是否包含短语

我不知道如何立即执行此操作并按相关性进行排序。但它并不像搜索“单词”和“单词”那么重要。我使用了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时,它无法找到单词,我想得到两个:单词和单词

如果你也可以帮我“连接”搜索作者的标题和描述,并以某种方式订购,我会真的很适合。

编辑:

我已经设法搜索所有标签(不仅指定,但对我来说没关系)

所以我有这样的代码:

    $query=strtolower(rawurldecode($_GET['s']));
    $nodes= $xml->xpath("//item[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),'$query')]") // . - all i suppose

我还使用$ query

的验证方式

1 个答案:

答案 0 :(得分:4)

所以你想知道,如何选择包含xpath文本搜索的<items><item>元素的所有子元素(我将区分大小写,你会在链接的答案中找到它)。首先,所有项目元素:

//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)]");

旧:您一次提出多个问题:

  1. 如何使用xpath不区分大小写进行搜索
  2. 如何找出相关性(以便按相关性对其进行排序)
  3. 相关性未定义。与其他人相关的内容可能与其他人无关,因此如果没有关于如何衡量相关性的具体定义,则很难回答问题的这一部分。

    对于不区分大小写的搜索,已经链接了重复的问题,因此您应该能够这样做。我眼中最好的第一个傻瓜:

    但是在这里它仍然是未定义的情况,更低和更高的情况。你还没有指明一个东西,所以你的问题无法得到真正的回答。

    此外,您还没有真正验证您的输入:

    $query = $_GET['query'];
    $nodes = $xml->xpath("//item[contains(title,'$query')]");
    

    这里可以使用GET参数注入xpath。小心,否则你根本不会做任何搜索。