PHP PHP (XML) removeChild entfernt nur teilweise?

FrazeColder

Lt. Commander
Registriert
Okt. 2013
Beiträge
1.721
Moin zusammen,

ich stehe leider vor einem Problem... Und zwar möchte ich eine XML Datei bearbeiten in welcher folgende Attribute rausfliegen sollen: sku, qty, priceUSD, priceGBP, priceAUD und priceSGD.

Die XML Datei ist folgende (hier noch im CSV): http://www.onlinekeystore.com/feed.php?key=GmYAQ4RcndpD3aPkjnWkJf4r&dl

Daraus habe ich eine XML Datei gemacht, die dann so aussieht:
Code:
<products>
  <product>
    <sku>SKU3223</sku>
    <title>BiT Evolution (STEAM)</title>
    <url>http://www.onlinekeystore.com/buy-bit-evolution-steam-pc-cd-keys.html</url>
    <qty>2147483647</qty>
    <priceEUR>0.99</priceEUR>
    <priceUSD>1.04</priceUSD>
    <priceGBP>0.85</priceGBP>
    <priceAUD>1.45</priceAUD>
    <priceSGD>1.51</priceSGD>
  </product>
</products>

Nun habe ich aber das Problem. Und zwar bekomme ich mit meinem Code folgendes heraus:
(XML ist unten) Manchmal entfernt er die Attribute und manchmal nicht... Wieso das?

Code:
$dom = new DOMDocument();
$dom->load('data/onlinekeystore.xml');
$root = $dom->documentElement;

$skuMarker = $root->getElementsByTagName('sku');
for($i = 0; $i < $skuMarker->length; $i++){
    $sku = $skuMarker->item($i);
    $skuMarker->item($i)->parentNode->removeChild($sku);
}

$qtyMarker = $root->getElementsByTagName('qty');
for($j = 0; $j < $qtyMarker->length; $j++){
    $qty = $qtyMarker->item($j);
    $qtyMarker->item($j)->parentNode->removeChild($qty);
}

$priceUSDMarker = $root->getElementsByTagName('priceUSD');
for($k = 0; $k < $priceUSDMarker->length; $k++){
    $priceUSD = $priceUSDMarker->item($k);
    $priceUSDMarker->item($k)->parentNode->removeChild($priceUSD);
}

$priceGBPMarker = $root->getElementsByTagName('priceGBP');
for($l = 0; $l < $priceGBPMarker->length; $l++){
    $priceGBP = $priceGBPMarker->item($l);
    $priceGBPMarker->item($l)->parentNode->removeChild($priceGBP);
}

$priceAUDMarker = $root->getElementsByTagName('priceAUD');
for($m = 0; $m < $priceAUDMarker->length; $m++){
    $priceAUD = $priceAUDMarker->item($m);
    $priceAUDMarker->item($m)->parentNode->removeChild($priceAUD);
}

$priceSGDMarker = $root->getElementsByTagName('priceSGD');
for($n = 0; $n < $priceSGDMarker->length; $n++){
    $priceSGD = $priceSGDMarker->item($n);
    $priceSGDMarker->item($n)->parentNode->removeChild($priceSGD);
}

Code:
  <product>
    
    <title>Gears of War CD KEY (RETAIL)</title>
    <url>http://www.onlinekeystore.com/gears-of-war-cd-key-retail.html</url>
    
    <priceEUR>6.99</priceEUR>
    
    
    
    
  </product>
  <product>
    <sku>SKU9</sku>
    <title>Battlefield 2142 Deluxe Edition (ORIGIN)</title>
    <url>http://www.onlinekeystore.com/battlefield-2142-deluxe-edition-origin.html</url>
    <qty>0</qty>
    <priceEUR>9.99</priceEUR>
    <priceUSD>10.53</priceUSD>
    <priceGBP>8.55</priceGBP>
    <priceAUD>14.58</priceAUD>
    <priceSGD>15.22</priceSGD>
  </product>

Hat da jemand eine Idee oder Lösung?
Mit freundlichen Grüßen und Vielen Dank
 
Lass dir halt nur das anzeigen, was du auch wirklich brauchst?

Code:
<?php
  $xml = new SimpleXMLElement('<xml/>');
  $file = file_get_contents('http://www.onlinekeystore.com/feed.php?key=GmYAQ4RcndpD3aPkjnWkJf4r&dl');
  $csv = array_map('str_getcsv', str_getcsv($file,"\n"));

  array_walk($csv, function(&$a) use ($csv) {
    $a = array_combine($csv[0], $a);
  });
  array_shift($csv);

  foreach ($csv as $element) {
    $product = $xml->addChild('product');
    $product->addChild('title', html_entity_decode($element['title'], null, "UTF-8"));
    $product->addChild('url', $element['url']);
    $product->addChild('priceEUR', $element['priceEUR']);
  };
  header('content-type: text/xml');
  print($xml->asXML());
?>
 
Also habe ich "Recht", dass mein Code eigtl. funktionieren müsste... oder?
 
Probier mal deine Zählschleifen rückwärts laufen zulassen. Ggf. wird ja das Array mit den Nodes neu indiziert sobald eines entfernt wird?
 
Da wenn ich das ganze Rückwärts laufen lasse passiert leider gar nichts... Programm läuft, aber er macht nichts...

Beispielcode:
Code:
$skuMarker = $root->getElementsByTagName('sku');
for($i = $skuMarker->length - 1; $i = 0 ; $i--){
    $sku = $skuMarker->item($i);
    $skuMarker->item($i)->parentNode->removeChild($sku);
}

@blablub1212: Der Code funktioniert bei mir nicht...
 
Hmm funktioniert hier, aber ich mag php zu wenig um gut über evtl. sicherheits relevante und möglicherweise gesperrte PHP-Funktionen zu wissen :D

Aber nichtsdestotrotz würde ich dein Konzept überdenken. Du machst für alles was du nicht haben willst einen neuen Loop über die Datei. Jetzt mit 4000 Zeilen geht das auf einem halbwegs guten System bei einem Aufruf relativ zügig. Hast du jetzt aber tausende von Zugriffen und eine vielfach größere Liste werden da Minuten vergehen bis du ein Ergebnis bekommst :)

Daher speicher deine Liste in ein Array und zerleg das in Zeilen. Loop einmal über alle Zeilen drüber und füge das was du willst in eine neue Variable oder lösche es aus deinem Array. Was besser ist hängt davon ab, wieviele Felder du willst. Hast du 1000 Felder und möchtest 999 davon haben würde ich das nicht gewünschte Feld wohl löschen.

Dazu würde ich mir bei solchen Sachen auch Gedanken über Pagination machen (https://en.wikipedia.org/wiki/Pagination#Pagination_in_web_content). Sonst braucht deine Seite je nach Internet-Geschwindigkeit ebenfalls Ewigkeiten bis sie geladen ist.

Code:
dev@nas:~$ php -v
PHP 7.0.8-0ubuntu0.16.04.3 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.8-0ubuntu0.16.04.3, Copyright (c) 1999-2016, by Zend Technologies
dev@nas:~$ php /var/www/dev/csvToXml.php
<?xml version="1.0"?>
<xml>
    <product>
        <title>Battlefield 2 Complete Collection CD KEY (Direct Download)</title>
        <url>http://www.onlinekeystore.com/battlefield-2-complete-collection-cd-key-origin.html</url>
        <priceEUR>5.95</priceEUR>
    </product>
    <product>
        <title>Call of Duty 4: Modern Warfare CD KEY (Direct Download)</title>
        <url>http://www.onlinekeystore.com/call-of-duty-4-modern-warfare-cd-key-direct-download.html</url>
        <priceEUR>9.99</priceEUR>
    </product>
    <product>
        <title>Gears of War CD KEY (RETAIL)</title>
        <url>http://www.onlinekeystore.com/gears-of-war-cd-key-retail.html</url>
        <priceEUR>6.99</priceEUR>
    </product>
 

Ähnliche Themen

Zurück
Oben