搜索XML项目PHP XPath - php

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

验证IBAN PHP - php

在设计新平台时,我们尝试集成IBAN编号。我们必须确保IBAN已经过验证,并且存储在数据库中的IBAN始终正确。那么验证数字的正确方法是什么? 参考方案 正如我在其他问题中解释的逻辑一样,我尝试自己创建一个函数。根据Wikipedia文章中解释的逻辑,在下面找到合适的功能。国家特定验证。它适合吗http://en.wikipedia.org/wiki/Int…

PHP PDO组按列名称查询结果 - php

以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…

使用精确的字符串作为xpath标识符 - php

我发现我需要使用xpath查询来查找几乎为regexp类型的字符串,但还无法查看如何对其进行管理。我正在使用的当前查询是: $result = $xpath->query('//ul/li[starts-with(@id, "message-")]'); 这导致了一些误报。它确实应该在寻找message-123或…

在xPath中的innerHTML? - php

有没有一种方法可以检索div元素中包含的HTML(和JavaScript)? 参考方案 我不是PHP开发人员,但发现了这一点:function getNodeInnerHTML(DOMNode $oNode) { $oDom = new DOMDocument(); foreach($oNode->childNode as $oChild) { $oD…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…