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

使用XPath和PHP删除XML中的节点

发布时间:2020-12-13 16:58:12 所属栏目:PHP教程 来源:网络整理
导读:我有一个 XML: root level name="main" level name="sub_1" content id="abc123" / /level /level/root 我想搜索id为abc123的节点并删除 content及其父级 level 所以最终的结果是: root level name="main" /level /root 我在PHP中试过没有结果,我做错了什
我有一个 XML:

<root>
   <level name="main">
      <level name="sub_1">
         <content id="abc123" />
      </level>
   </level>
</root>

我想搜索id为abc123的节点并删除< content>及其父级< level>

所以最终的结果是:

<root>
  <level name="main">
  </level> 
</root>

我在PHP中试过没有结果,我做错了什么?

$doc = new DOMDocument;
 $doc->loadxml($xml_from_file); 
 $xpath = new DOMXPath($doc);
 $node_list = $xpath->query("content[@id='abc123']/parent::*"); 
 $node = $node_list->item(0); 
 $doc->removeChild($node);

解决方法

以下是您的来源的两个问题.

表达式仅匹配子节点.你需要用//来匹配任何node:// content [@ id =’abc123′] / parent :: *.

找到的节点不是文档的子节点,因此您需要将其从其父节点中删除:$node-> parentNode-> removeChild($node);.

如果节点不存在,我建议使用foreach来避免问题.

$document = new DOMDocument;
$document->loadxml($xmlString); 
$xpath = new DOMXPath($document);

foreach ($xpath->evaluate("//content[@id='abc123']/parent::*") as $node) {
  $node->parentNode->removeChild($node);
}

echo $document->saveXml();

(编辑:李大同)

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

    推荐文章
      热点阅读