PHP XML remove element and all children by name

前端 未结 2 1025
离开以前
离开以前 2020-12-06 23:39

I have an XML file structured as:


  
    
    
             


        
相关标签:
2条回答
  • 2020-12-07 00:01

    This should do it:

    foreach ($featureddel as $node) {
        $node->parentNode->removeChild($node);
    }
    

    You're probably just forgetting that with both xPath and getElementsByTagName you get a list (DOMNodeList) of items. That object itself only has a property $length, which you can use to determine how many objects are on the list, and function item($index), which returns specified DOMNode from the list. DOMNodeList is also iteratable through foreach. So besides foreach like I wrote above you can also do:

    for ($i = 0; $i < $featureddel->length; $i++) {
        $temp = $featureddel->item($i); //avoid calling a function twice
        $temp->parentNode->removeChild($temp);
    }
    

    But foreach is usually more preferred.

    0 讨论(0)
  • 2020-12-07 00:02

    Both DOMElement::getElementsByTagName and DOMXPath::query return a DOMNodeList. Your code seems to be expecting a single DOMNode instead. Try this:

    $featureddel = $xpath->query('//featured');
    // OR:
    // $featuredde1 = $dom->getElementsByTagName('featured');
    
    foreach ($featuredde1 as $node) {
        $node->parentNode->removeChild($node);
    }
    

    Edit: This exact code works as expected for me (PHP 5.3, Debian Squeeze):

    <?php 
    $xml = '<root>
      <featured>
        <title></title>
        <tweet></tweet>
        <img></img>
      </featured>
    </root>';    
    $dom = new DOMDocument();
    $dom->loadXML($xml);
    $featuredde1 = $dom->getElementsByTagName('featured');
    
    foreach ($featuredde1 as $node) {
        $node->parentNode->removeChild($node);
    }
    echo $dom->saveXML();
    

    The output is:

    <?xml version="1.0"?>
    <root>
    
    </root>
    
    0 讨论(0)
提交回复
热议问题