【问题标题】:Searching XML items PHP XPath搜索 XML 项目 PHP XPath
【发布时间】:2012-04-15 12:34:08
【问题描述】:

我有一个 XML 文档:

     <items>
     <item>
     <id>1</id>
     <title>Title ABC Defg</title>
     <author>Author Name</author>
     <description>Description text </description>
     </item>
     ...
     </items>

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

我不知道如何立即执行并按相关性排序。但这并不像搜索“Word”和“word”那么重要。我使用了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 的验证方式

【问题讨论】:

标签: php xml search xpath


【解决方案1】:

所以您想知道,如何选择包含使用 xpath 搜索的文本的 &lt;items&gt;&lt;item&gt; 元素的所有子元素(我忽略了区分大小写,您可以在链接的答案中找到它)。首先是所有item元素:

//items/item

你已经有了。要仅返回包含某些文本的内容,请添加谓词:

//items/item[contains(., 'XYZ')]

如果您只想在&lt;title&gt; 子元素内搜索:

//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. 如何找出相关性(以便按相关性对其进行排序)

相关性未定义。对一个人可能相关的内容可能对其他人无关,因此如果没有关于如何衡量相关性的具体定义,就很难回答您问题的这一部分。

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

但是这里也没有定义什么是大小写,小写和大写。您还没有指定一件事,所以您的问题无法得到真正的回答。

你也没有真正验证你的输入:

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

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

【讨论】:

  • 相关性 - 我明白了 - 我只是想关注不敏感的大小写,我正在研究它 - 我想用指定的子节点搜索父节点你能告诉我更多关于验证输入的信息吗?如何防止注射?
  • "但是如果里面有单引号怎么办?" - 只有 ' 和 " 可能是危险的?如果是这样,我可以从字符串中删除它们
  • @NiedamWam:当然,您也可以删除。我只是举了一个例子,如果你想把它放进去,有点保守:应该能够搜索,所以保留它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
相关资源
最近更新 更多