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

时间:2015-09-26 00:33:40

标签: php xml xpath

我有int

XML

我想搜索<root> <level name="main"> <level name="sub_1"> <content id="abc123" /> </level> </level> </root> id的节点并删除abc123及其父<content>

所以最终的结果是:

<level>

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

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

3 个答案:

答案 0 :(得分:3)

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

表达式仅匹配子节点。您需要使用//启动它以匹配任何节点://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();

答案 1 :(得分:2)

<?php

$xml_from_file = '<root>
   <level name="main">
      <level name="sub_1">
         <content id="abc123" />
      </level>
   </level>
</root>';

 $doc = new DOMDocument;
 $doc->loadxml($xml_from_file); 
 $xpath_selector = new DOMXPath($doc);
//Here you forget at the begin the //
 $node_list = $xpath_selector->query("//content[@id='abc123']/parent::*"); 
//here you get the reference to the parent of content
 $node = $node_list->item(0); 
//but for remove the child you need to go to the parent node
 $node->parentNode->removeChild($node);
 echo $doc->saveXML();

?> 

输出:

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

答案 2 :(得分:-2)

这是一种黑客攻击,但我让它与你的例子一起工作。您的xpath查询可能存在一个问题 - 请注意开头的//

$xml_string = '<root>
    <level name="main">
        <level name="sub_1">
            <content id="abc123" />
        </level>
    </level>
</root>';

// using SimpleXMLElement instead of DOMDocument
$xml = new SimpleXMLElement($xml_string);

// standardize the string version of the xml so str_replace works
$xml_string = $xml->asXML();

// search for the target; note the // at the beginning of the query
$target = $xml->xpath("//content[@id='abc123']/parent::*");

// use simple string replacement to remove the node
echo str_replace($target[0]->asXML(), '', $xml_string);

不是很优雅,但似乎可以解决你的问题。