Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP XPath中搜索XML项_Php_Xml_Search_Xpath - Fatal编程技术网

在PHP XPath中搜索XML项

在PHP XPath中搜索XML项,php,xml,search,xpath,Php,Xml,Search,Xpath,我有一个XML文档: <items> <item> <id>1</id> <title>Title ABC Defg</title> <author>Author Name</author> <description>Description text </description> </item>

我有一个XML文档:

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

我还使用了$query的一种验证,因此您想知道如何选择包含xpath文本搜索的
元素的所有子元素(我省略了区分大小写,您可以在链接的答案中找到)。首先,所有项目要素:

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

//items/item[contains(., 'XYZ')]
如果只想在
子元素中搜索:

//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 ...
您可以通过做一些事情来防止这种情况,特别是将值分配给文档并与之进行比较,然后:

$query = 'd\'oh';
$xml['query'] = $query;
$nodes = $xml->xpath("//item[contains(title, /*/@query)]");

Old:您可以同时问多个问题:

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

    对于案例不敏感搜索,已经链接了重复的问题,所以您应该能够这样做。在我眼里,最好的第一件事是:

    但在这里,它仍然没有定义什么情况下,较低和较高,是。你没有具体说明一件事,所以你的问题无法得到真正的回答

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

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

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

    所以您想知道,如何选择包含xpath文本搜索的
    元素的所有子元素(我省略了区分大小写,您可以在链接的答案中找到)。首先,所有项目要素:

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

    //items/item[contains(., 'XYZ')]
    
    如果只想在
    子元素中搜索:

    //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 ...
    
    您可以通过做一些事情来防止这种情况,特别是将值分配给文档并与之进行比较,然后:

    $query = 'd\'oh';
    $xml['query'] = $query;
    $nodes = $xml->xpath("//item[contains(title, /*/@query)]");
    

    Old:您可以同时问多个问题:

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

    对于案例不敏感搜索,已经链接了重复的问题,所以您应该能够这样做。在我眼里,最好的第一件事是:

    但在这里,它仍然没有定义什么情况下,较低和较高,是。你没有具体说明一件事,所以你的问题无法得到真正的回答

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

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

    可以在此处使用GET参数注入xpath。当心,否则,您根本不会进行任何搜索。

    请参阅phpposible中的伪不区分大小写查询可能与的重复项相同。我强烈建议不要替换XPath表达式框架中的外部字符串——您可能很容易成为XPath注入的牺牲品。请参阅phpposible中的伪不区分大小写查询我强烈建议不要在XPath表达式框架中替换外部字符串——您可能很容易成为XPath注入的受害者。相关性-我明白了-我只想关注不敏感的大小写,我正在研究它-我想用指定的子节点搜索父节点你能告诉我更多吗关于验证输入?我怎样才能防止注射呢?“但是如果有一个单独的引语在里面会发生什么呢?”-只有“和”“会很危险吗?如果是的话,我可以从string@NiedamWam:当然,您也可以删除。我只是举了一个例子,如果你想把它放进去,有些保守:应该能够搜索,所以保持它在里面。相关性-我明白了-我只是想关注不敏感的大小写,我正在研究它-我想搜索带有指定子节点的父节点你能告诉我更多关于验证输入的信息吗?我怎样才能防止注射呢?“但是如果里面只有一句话怎么办?”-只有”和“可能是危险的?如果是这样的话,我可以从列表中删除它们string@NiedamWam:当然,你也可以删除。我只是举了一个例子,如果你想把它放进去,有些保守:应该可以搜索,所以把它放进去。