首页 > 解决方案 > SimpleXML 搜索子节点并检索所有节点

问题描述

我或多或少需要指导才能继续前进..

有一个页面显示容器中的每个节点(对其进行处理)

XML

<archive>
<data id="1111">
<name>Name</name>
<text>Lots of stuff and things</text>
<etc>Etc</etc>
</data>
<data id="2222">
<name>Name</name>
<text>Different stuff and things</text>
<etc>Etc</etc>
</data>
<data id="3333">
<name>Name</name>
<text>More stuff and things</text>
<etc>Etc</etc>
</data>
// and so on
</archive>

这部分采用 XML 并回显值等..

  $master = array_slice($xml_get->xpath('data'), $start_page, 25);
  $master = array_reverse($master);

  foreach($master as $arc) {

    $last_name  = $arc[0]->name;
    $last_data  = $arc[0]->data;
    $last_etc   = $arc[0]->etc;

// does stuff with values

}

我想要做的是有一个搜索字段,该字段采用该搜索关键字并搜索所有子节点,然后 foreach 每个匹配的节点+子节点。

老实说,我只是希望获得一些关于如何实现这一目标的指导。我知道如何通过 id= 单独抓取一个节点,但在那之后..需要指导。

标签: phpxmlsearchsimplexml

解决方案


作为一个快速示例,<text>使用 XPath 搜索元素(我已经更改了您提供的示例数据以显示它选择的差异)

$data = '<archive>
    <data id="1111">
        <name>Name</name>
        <text>Lots of stuff and things</text>
        <etc>Etc</etc>
    </data>
    <data id="2222">
        <name>Name</name>
        <text>Different stuff and things</text>
        <etc>Etc</etc>
    </data>
    <data id="3333">
        <name>Name</name>
        <text>More stuff and other things</text>
        <etc>Etc</etc>
    </data>
</archive>';

$xml_get = simplexml_load_string($data);

$textSearch = "stuff and things";

$matches = $xml_get->xpath('//data[contains(text,"'.$textSearch.'")]');
foreach($matches as $arc) {

    echo "text=".$arc->text.PHP_EOL;

}

输出..

text=Lots of stuff and things
text=Different stuff and things

XPath -//data[contains(text,"'.$textSearch.'")]基本上说要查找具有包含正在搜索的字符串的值<data>的元素的任何元素。<text>您只需更改即可更改它使用的字段text


推荐阅读