Remove empty tags from a XML with PHP

前端 未结 5 1125
悲哀的现实
悲哀的现实 2020-11-27 08:02

Question

How can I remove empty xml tags in PHP?

Example:

 $value1 = \"2\";
 $value2 = \"4\";
 $value3 = \"\";

 xml = \'

        
相关标签:
5条回答
  • 2020-11-27 08:07

    This works recursively and removes nodes that:

    • contain only spaces
    • do not have attributes
    • do not have child notes
    // not(*) does not have children elements
    // not(@*) does not have attributes
    // text()[normalize-space()] nodes that include whitespace text
    while (($node_list = $xpath->query('//*[not(*) and not(@*) and not(text()[normalize-space()])]')) && $node_list->length) {
        foreach ($node_list as $node) {
            $node->parentNode->removeChild($node);
        }
    }
    
    0 讨论(0)
  • 2020-11-27 08:13

    If you're going to be a lot of this, just do something like:

    $value[] = "2";
    $value[] = "4";
    $value[] = "";   
    
    $xml = '<parentnode>';
    for($i=1,$m=count($value); $i<$m+1; $i++)
          $xml .= !empty($value[$i-1]) ? "<tag{$i}>{$value[$i-1]}</tag{$i}>" : null;
    $xml .= '</parentnode>';
    echo $xml;
    

    Ideally though, you should probably use domdocument.

    0 讨论(0)
  • 2020-11-27 08:14
    $dom = new DOMDocument;
    
    $dom->loadXML($xml);
    
    $elements = $dom->getElementsByTagName('*');
    
    foreach($elements as $element) {
    
       if ( ! $element->hasChildNodes() OR $element->nodeValue == '') {
           $element->parentNode->removeChild($element);
       }
    
    } 
    
    echo $dom->saveXML();
    

    CodePad.

    0 讨论(0)
  • 2020-11-27 08:21

    The solution that worked with my production PHP SimpleXMLElement object code, by using Xpath, was:

    /*
     * Remove empty (no children) and blank (no text) XML element nodes, but not an empty root element (/child::*).
     * This does not work recursively; meaning after empty child elements are removed, parents are not reexamined.
     */
    foreach( $this->xml->xpath('/child::*//*[not(*) and not(text()[normalize-space()])]') as $emptyElement ) {
        unset( $emptyElement[0] );
    }
    

    Note that it is not required to use PHP DOM, DOMDocument, DOMXPath, or dom_import_simplexml().

    //this is a recursively option
    
    do {
        $removed = false;
        foreach( $this->xml->xpath('/child::*//*[not(*) and not(text()[normalize-space()])]') as $emptyElement ) {
            unset( $emptyElement[0] );
            $removed = true;
        }
    } while ($removed) ;
    
    0 讨论(0)
  • 2020-11-27 08:23

    You can use XPath with the predicate not(node()) to select all elements that do not have child nodes.

    <?php
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = false;
    $doc->loadxml('<parentnode>
        <tag1>2</tag1>
        <tag2>4</tag2>
        <tag3></tag3>
        <tag2>4</tag2>
        <tag3></tag3>
        <tag2>4</tag2>
        <tag3></tag3>
    </parentnode>');
    
    $xpath = new DOMXPath($doc);
    
    foreach( $xpath->query('//*[not(node())]') as $node ) {
        $node->parentNode->removeChild($node);
    }
    
    $doc->formatOutput = true;
    echo $doc->savexml();
    

    prints

    <?xml version="1.0"?>
    <parentnode>
      <tag1>2</tag1>
      <tag2>4</tag2>
      <tag2>4</tag2>
      <tag2>4</tag2>
    </parentnode>
    
    0 讨论(0)
提交回复
热议问题