Php SimpleXML查找父节点中任意级别的特定子节点

pdkcd3nj  于 2023-02-28  发布在  PHP
关注(0)|答案(3)|浏览(119)

我正在使用SimpleXML来解析我的xml文件。我正在遍历它,并且在每个节点中我需要获取一个特定标记的值。

<node>
    <child1></child1>
    <findme></findme>
    <child2></child2>
</node>
<node>
    <child1>
        <findme></findme>
    </child1>
    <child2></child2>
</node>
<node>
    <child1></child1>
    <child2>
      <another>
            <findme></findme>
      </another>
    </child2>
</node>

在每个节点中,我需要得到findme标记。但我不知道它可以在哪一级,我所知道的只是一个标记名

ebdffaop

ebdffaop1#

我做出的唯一决定是使用这个递归函数

foreach($xml as $prod){
  ...
  $findme = getNode($prod, 'fabric');
  ...
}

function getNode($obj, $node) {
    if($obj->getName() == $node) { 
        return $obj;
    }
    foreach ($obj->children() as $child) {
        $findme = getNode($child, $node);
        if($findme) return $findme;
    }
}
    • 更新**

同样,正如评论中所建议的,我们可以像这样使用DOMDocument类:

$dom = new DOMDocument();
 $dom->LoadXML($xmlStr);
 $nodes = $dom->getElementsByTagName('node');

 foreach($nodes as $node)
 { 
    $findme = $node->getElementsByTagName("findme")->item(0);
    echo $findme->textContent."\r";
 }
t30tvxxf

t30tvxxf2#

你需要使用XPath来查找目标元素,因为你不知道目标标签的级别。php SimpleXMLElement类有xpath方法,通过XPath来查找元素。

$xml = new SimpleXMLElement($xmlStr);
$result = $xml->xpath('//findme');
foreach($result as $elem)
{ 
    echo $elem;
}

您可以在demo中检查结果

    • 编辑:**

如果您想在另一个元素中查找特定元素,则需要使用DOMDocument类。

$dom = new DOMDocument();
$dom->loadXML($xmlStr);
$nodes = $dom->getElementsByTagName('node');
foreach($nodes as $node)
{ 
   echo $node->getElementsByTagName("findme")->item(0)->textContent;
}

您可以在demo中检查结果

yacmzcpb

yacmzcpb3#

一直在寻找同样的。经过一番修修补补,意识到以下将工作。
$parent->xpath('.//findme')
这里,.表示电流电平,并且//表示电流电平/节点内的任何地方。

相关问题