删除具有相同名称的XML子项

时间:2018-01-09 17:38:16

标签: php xml xpath removechild

我有一个包含以下内容的大型XML:

<?xml version="1.0" encoding="UTF-8"?>
<valasz xmlns="" verzio="1.0">
<arak>
<ar>
<cikkid>439902</cikkid>
<cikkszam>DVDV-16Z10</cikkszam>
<listaar>1225,0000000</listaar>
<ar>1157,6200000</ar>
<akcios_ar>1157,6200000</akcios_ar>
<devizanem>HUF</devizanem>
</ar>
<ar>
..
<ar>1157,6200000</ar>
...
</ar>
</arak>

我想要的是删除arak-&gt; ar-&gt; ar子,因为它导致导入它看起来像重复,并减慢了进程。

我尝试了以下内容:

    $node = readfile($arlista[0]);
    $nodes = simplexml_load_string($node);
    $arnode = $nodes->xpath("/valasz/arak/ar/ar");
        foreach ($arnode as &$ar){
            $nodes->removeChild($ar);
        }
    echo $nodes;

这只返回原始的xml,而不删除arak-&gt; ar-&gt; ar子节点。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

SimpleXML中没有:: removeChild()这样的东西。 你想在foreach循环中做的是:

foreach ($arnode as $ar){
    unset($ar->{0});
}

请注意:发布的XML无效,但我确信这只是某种复制和粘贴漏洞

完整代码:

$xml = '<?xml version="1.0" encoding="UTF-8"?>
            <valasz xmlns="" verzio="1.0">
                <arak>
                    <ar>
                        <cikkid>439902</cikkid>
                        <cikkszam>DVDV-16Z10</cikkszam>
                        <listaar>1225,0000000</listaar>
                        <ar>1157,6200000</ar>
                        <akcios_ar>1157,6200000</akcios_ar>
                        <devizanem>HUF</devizanem>
                    </ar>
                    <ar>
                        <ar>1157,6200000</ar>
                    </ar>
                </arak>
            </valasz>';
$nodes = simplexml_load_string($xml);
$arnode = $nodes->xpath("/valasz/arak/ar/ar");
foreach ($arnode as $ar){
    unset($ar->{0});
}
print_r($nodes); 

返回此     SimpleXMLElement对象     (         [@attributes] =&gt;排列             (                 [verzio] =&gt; 1.0             )

    [arak] => SimpleXMLElement Object
        (
            [ar] => Array
                (
                    [0] => SimpleXMLElement Object
                        (
                            [cikkid] => 439902
                            [cikkszam] => DVDV-16Z10
                            [listaar] => 1225,0000000
                            [akcios_ar] => 1157,6200000
                            [devizanem] => HUF
                        )

                    [1] => SimpleXMLElement Object
                        (
                        )

                )

        )

)