我有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>
答案 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);
不是很优雅,但似乎可以解决你的问题。