PHP - 通过DOM查找和删除XML节点

时间:2016-03-14 17:22:05

标签: php xml

任何人都可以指出为什么下面的PHP没有删除XML节点?

我想要删除包含original_number值823的整个图像节点。

提前致谢。

$xml = '<?xml version="1.0"?>
<property> 
    <edited>true</edited> 
    <images> 
        <image> 
            <is_required><![CDATA[true]]></is_required> 
            <original_number><![CDATA[823]]></original_number> 
        </image>

        <image> 
            <is_required><![CDATA[true]]></is_required> 
            <original_number><![CDATA[555]]></original_number> 
        </image>
</images>
</property>';

$originalNumberToDelete = 823;

$dom = new DOMDocument();
$dom->loadXML( $xml->asXML(), LIBXML_NOBLANKS );
$dom->formatOutput = true;

$xpath = new DOMXPath($dom);
foreach( $xpath->query("property/images/image[original_number='".$originalNumberToDelete."']") as $node) {
$node->parentNode->removeChild($node);
}

echo $dom->saveXML();

1 个答案:

答案 0 :(得分:1)

也许可能的解决方案是改变

$dom->loadXML( $xml->asXML(), LIBXML_NOBLANKS );

$dom->loadXML( $xml, LIBXML_NOBLANKS );

然后用双正斜杠开始你的xpath表达式:

$xml = '<?xml version="1.0"?>
<property>
    <edited>true</edited>
    <images>
        <image>
            <is_required><![CDATA[true]]></is_required>
            <original_number><![CDATA[823]]></original_number>
        </image>

        <image>
            <is_required><![CDATA[true]]></is_required>
            <original_number><![CDATA[555]]></original_number>
        </image>
</images>
</property>';

$originalNumberToDelete = 823;

$dom = new DOMDocument();
$dom->loadXML( $xml, LIBXML_NOBLANKS );
$dom->formatOutput = true;

$xpath = new DOMXPath($dom);
foreach( $xpath->query("//property/images/image[original_number='".$originalNumberToDelete."']") as $node) {
    $node->parentNode->removeChild($node);
}

echo $dom->saveXML();

Demo