Zwei Werte in einem Durchgang lesen in XML?

FrazeColder

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

Ich habe verschiedene XML Dateien aus denen ich Daten auslesen muss und in eine Datenbank packen muss.
Da es nun aber sein könnte, die XML Dateien sind nicht von mir, dass ein Produkt mal keinen Preis oder keinen Namen beinhaltet, muss ich das ganze in einer Abfrage erledigen und nicht so wie jetzt gelöst, in zwei separaten Abfragen:

Code:
$doc = simplexml_import_dom($dom);
$items = $doc->xpath("//$tagName");

$titles = array();
$prices = array();

foreach ($items as $item) {
    $node = dom_import_simplexml($item);

    if(strcasecmp($tagName, "title") == 0){
        array_push($titles, $node->textContent);
    }

    if(strcasecmp($tagName, "price") == 0){
        array_push($prices, $node->textContent);
    }
}

Denn dann verschiebt sich mein komplettes Array... Das möchte ich gerne vermeiden.
Nur weiß ich nicht, wie ich mit $dom->xpath("//..."); den namen und preis auf einmal abfragen soll...

Daher funktioniert meine Lösung auch nicht wirklich, wenn halt in einem XML mal kein Preis oder kein Name enthalten ist. Hat jemand eine Idee, wie ich durch die Produkte iterieren kann um mir den Preis UND den Namen in einem Durchgang von je einem Produkt zu holen?

XML Beispiel:
Code:
<products>
<product>
<name>Battlefield 1</name>
<preis>80</preis>
<sterne>3</sterne>
<desc>Dies ist ein Text</desc>
<link>https://www.google.de/</link>
</product>
<product>
<name>Battlefield 2</name>
<preis>180</preis>
<sterne>3</sterne>
<desc>Dies ist ein Text</desc>
<link>https://www.google.de/</link>
</product>
<product>
<name>Battlefield 3</name>
<preis>280</preis>
<sterne>3</sterne>
<desc>Dies ist ein Text</desc>
<link>https://www.google.de/</link>
</product>
<product>
<name>Battlefield 4</name>
<preis>380</preis>
<sterne>3</sterne>
<desc>Dies ist ein Text</desc>
<link>https://www.google.de/</link>
</product>
<product>
<name>Battlefield 5</name>
<preis>480</preis>
<sterne>3</sterne>
<desc>Dies ist ein Text</desc>
<link>https://www.google.de/</link>
</product>
</products>

MfG und Vielen Dank!
 
Du kannst items als product-Knoten nehmen, irgendwie so:
PHP:
$items = $xml->xpath("/products/product");
 
Warum arbeitest Du nicht direkt mit dem DOM-Objekt?
Code:
$products = $dom->getElementsByTagName('product');
 
$titles = array();
$prices = array();
 
foreach ($products as $product) {
        $title = $product->getElementsByTagName('title');
        $price = $product->getElementsByTagName('price');
        if($title.hasChildNodes() and $price.hasChildNodes()) {
            array_push($titles, $title->item(0)->nodeValue);
            array_push($prices, $price->item(0)->nodeValue);
        }
    }
Eventuell solltest Du nicht nur prüfen, ob es Preis und Titel gibt, sondern auch, ob sie sinnvolle Werte enthalten ...
 
Zuletzt bearbeitet:
Zurück
Oben