toHo
toHo

Reputation: 438

How to remove XML parent node based on child conditions PHP

Hi I am trying to clean up xml file out of positions I dont need. Here is my code so far:

<?php
    $doc = new DOMDocument;
    $doc->load('merg.xml');

    $xpath = new DOMXPath($doc);

    $products = $xpath->query('//offer/products/*');

    printf('There is %d products<br /><br />', $products->length);

    function findStopPointByName($xml, $query) {
      $upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZĄŻŚĆŹĆÓŁ";
      $lower = "abcdefghijklmnopqrstuvwxyzążśćźńół";
      $arg_query    = "translate('$query', '$upper', '$lower')";

      return $xml->query("//offer/products/product/description/name[contains(text(),$arg_query)]");
    }
    foreach(findStopPointByName($xpath,'Skór') as $node)
    {
        $node->parentNode->removeChild($node);
    }

    $doc->save('merg_fixed.xml');
?>

Structure of XML:

<offer>
 <products>
  <product>
   <description>
    <name>Name of the product</name>
     ...
    </name>
     ...
   </description>
  </product>
 </products>
</offer>

I am trying to remove all PRODUCT where its NAME contains 'Skór' in any case (Skór, skór, SKÓR - is enough). Funcion findStopPointByName returns DOMNodeList of correct length, but nothing is removed from actual XML file, please help.

Upvotes: 0

Views: 721

Answers (1)

splash58
splash58

Reputation: 26153

First, you can directly find node product with the condition

Second, to make search case insensitive, you can translate node text in any case but should use pattern in the same case. As the result, your code may be so

 function findStopPointByName($xml, $query) {
  $upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZĄŻŚĆŹĆÓŁ";
  $lower = "abcdefghijklmnopqrstuvwxyzążśćźńół";
  $arg_query    = "translate(text(), '$upper', '$lower')";
  $q = "//product[description/name[contains($arg_query, '$query')]]" ."\n";
  return $xml->query($q);
}

$doc = new DOMDocument;
$doc->load('merg.xml');
$xpath = new DOMXPath($doc);
foreach(findStopPointByName($xpath,'skór') as $node)
    $node->parentNode->removeChild($node);

echo $doc->saveXML();

Demo on eval.in

Upvotes: 1

Related Questions