加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 在递归函数中获取xml节点的xpath

发布时间:2020-12-13 22:07:09 所属栏目:PHP教程 来源:网络整理
导读:假设我有一些代码可以递归迭代遍历 XML文件,如下所示: $xmlfile = new SimpleXMLElement('http://www.domain.com/file.xml',null,true);xmlRecurse($xmlfile,0);function xmlRecurse($xmlObj,$depth) { foreach($xmlObj-children() as $child) { echo str_r
假设我有一些代码可以递归迭代遍历 XML文件,如下所示:

$xmlfile = new SimpleXMLElement('http://www.domain.com/file.xml',null,true);
xmlRecurse($xmlfile,0);
function xmlRecurse($xmlObj,$depth) {
  foreach($xmlObj->children() as $child) {
    echo str_repeat('-',$depth).">".$child->getName().": ".$subchild."n";
    foreach($child->attributes() as $k=>$v){
        echo "Attrib".str_repeat('-',$depth).">".$k." = ".$v."n";
    }
    xmlRecurse($child,$depth+1);
  }
}

我如何计算每个节点的xpath,以便我可以存储它以映射到其他代码?

解决方法

显而易见的方法是将XPath作为第三个参数传递,并在深入挖掘时构建它.您必须考虑具有相同名称的兄弟姐妹,因此您必须在迭代时跟踪与当前子项同名的先例兄弟姐妹的数量.

工作范例:

function xmlRecurse($xmlObj,$depth=0,$xpath=null) {
  if (!isset($xpath)) {
    $xpath='/'.$xmlObj->getName().'/';
  }
  $position = array();

  foreach($xmlObj->children() as $child) {

    $name = $child->getName();
    if(isset($position[$name])) {
      ++$position[$name];
    }
    else {
      $position[$name]=1;
    }
    $path=$xpath.$name.'['.$position[$name].']';

    echo str_repeat('-',$depth).">".$name.": $pathn";
    foreach($child->attributes() as $k=>$v){
        echo "Attrib".str_repeat('-',$depth).">".$k." = ".$v."n";
    }

    xmlRecurse($child,$depth+1,$path.'/');
  }
}

但是要注意,映射整个文档并沿途存储XPath的整个想法似乎很奇怪.实际上,您可能正在针对完全不同的问题制定错误的解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读