Mal wieder Probleme mit der Ausgabe einer xml Datei

spikaner

Quereinsteiger @ php
Ich habe eine .xml mit folgenden aufbau
Code:
            [21] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [name] => bakedPotato
                            [count] => 1
                            [scrapable] => False
                            [craft_area] => campfire
                            [craft_tool] => cookingGrill
                            [craft_time] => 15
                        )

                    [ingredient] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [name] => potato
                                    [count] => 1
                                )

                        )

                )

            [22] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [name] => antibiotics
                            [count] => 1
                            [scrapable] => False
                            [craft_area] => campfire
                            [craft_tool] => beaker
                            [craft_time] => 150
                        )

                    [ingredient] => Array
                        (
                            [0] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [name] => moldyBread
                                            [count] => 1
                                        )

                                )

                            [1] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [name] => potassiumNitratePowder
                                            [count] => 1
                                        )

                                )

                        )

                )
Ich bin jetzt soweit das ich schon mal alles durchzählen kann und ausgeben bis auf die 'ingredient'
hier mal mein bisheriger grob hingeklatschter Code.
PHP:
<?php
function xml_attribute($object, $attribute)
{
    if(isset($object[$attribute]))
        return (string) $object[$attribute];
}
$file="recipes.xml";
if (file_exists($file)) {
    $inhalt=file_get_contents($file);
    if (!empty($inhalt)) {
        $xml = new SimpleXMLElement($inhalt);
//        echo "<pre>";
//        print_r($xml);
//        echo "</pre>";
       
        $zeilen = count ($xml->recipe);
//        echo $zeilen;

        for ($i = 0; $i < $zeilen; $i++){
        $zeile = $xml->recipe->$i;
       
        // kochgedönz
        $pruf = xml_attribute($zeile, 'craft_area');
        if (isset($pruf)) {
            $name = xml_attribute($zeile, 'name');
            echo $name."<br>";
           
            // hier komme ich nicht weiter.
            $zutat = count (xml_attribute($zeile, 'ingredient'));
            echo $zutat."<br>";
            }

        }
        // restliche ausgaben
       
    }
    else
    {
        echo "Kein Dateiinhalt.";
    }
}
else
{
    echo "Die Datei ".$file." existiert nicht";
}
?>
Kann mir jemand sagen wie ich jetzt an die Menge der 'ingredient' und den inhalt komme, stehe momentan auf den Schlauch.

mfg Spikaner
 
Im Anhang mal die Datei, die sich mehr oder weniger alle paar Tage / Wochen ändert (wegen Uploadbeschränkung in .txt gespeichert)

@ComFreek XPath? Sagt mir jetzt erstmal gar nix :(

mfg Spikaner
 

Anhänge

  • recipes.txt
    98,2 KB · Aufrufe: 8
Habe es jetzt doch auf die "altmodische" Weise gelöst..,war wohl zu müde.
Werde mich trozdem bei Gelegenheit mal mit XPath beschäftigen ;)
PHP:
<?php
function xml_attribute($object, $attribute)
{
    if(isset($object[$attribute]))
        return (string) $object[$attribute];
}
$file="recipes.xml";
if (file_exists($file)) {
    $inhalt=file_get_contents($file);
    if (!empty($inhalt)) {
        $xml = new SimpleXMLElement($inhalt);
//        echo "<pre>";
//        print_r($xml);
//        echo "</pre>";
        $zeilen = count ($xml->recipe);
//        echo $zeilen;

        for ($i = 0; $i < $zeilen; $i++){
            $zeile = $xml->recipe->$i;
         
            // kochgedönz
            $pruf = xml_attribute($zeile, 'craft_area');
            if (isset($pruf)) {
                $name = xml_attribute($zeile, 'name');
                $geschirr = xml_attribute($zeile, 'craft_tool');
                $menge = xml_attribute($zeile, 'count');
                $zeit = xml_attribute($zeile, 'craft_time');
                echo "Name: ".$name." Geschirr: ".$geschirr." Menge: ".$menge." Zeit: ".$zeit."<br>";
                $zutat1 = count ($xml->recipe->$i->ingredient);
                for ($y = 0; $y < $zutat1; $y++){
                    $zut = $xml->recipe->$i->ingredient->$y;
                    $namezut = xml_attribute($zut, 'name');
                    $mengezut = xml_attribute($zut, 'count');
                    echo "Was: ".$namezut." Menge: ";
                    echo $mengezut."<br>";
                }
            echo "<br><br>";
            }
            else
            {
                // restliche ausgaben ohne craft_area
            }
        }
    }
    else
    {
        echo "Kein Dateiinhalt.";
    }
}
else
{
    echo "Die Datei ".$file." existiert nicht";
}
?>
Über nen Beispiel wie mein Code mit XPath ausschauen könnte zur Veranschaulichung würde ich mich sehr freuen.
(Darum erstmal noch nicht erledigt)

mfg Spikaner
 
Welche Daten genau möchtest du verarbeiten? Nachdem ich deine XML-Datei angeschaut habe, komme ich zum Schluss, dass XPath vielleicht doch nicht notwendig/keine große Erleichterung bei deinem Fall ist.

Ich würde deine IF-Bedingungen umkehren, dann schaut der Code gleich viel sauberer aus.
 
@ComFreek
Ich brauche beide nur ebend jeweils anders dargestellt, zu einem die Ausgaben wo "craft_area" vor kommt zum anderen , die ohne "craft_area" darum die noch nicht vorhandene "else" erste ausgabe wo jetzt soweit funktioniert soll in eine Tabelle mit 2*2 kommen , rest kommt in eine Tabelle 5*5 mit den Gitter
2G5PabE.jpg

wo die Daten "grid" in der xml stehen bsp.
Code:
<recipe name="PumpShotgun_barrel_mold" count="1" scrapable="False" craft_time="5" >
        <ingredient name="clayLump" count="1" grid="-1, 0"/>
        <ingredient name="PumpShotgun_barrel" count="1" grid="0, 0"/>
        <ingredient name="clayLump" count="1" grid="1, 0"/>
        <ingredient name="clayLump" count="1" grid="-1, 1"/>
        <ingredient name="clayLump" count="1" grid="0, 1"/>
        <ingredient name="clayLump" count="1" grid="1, 1"/>
    </recipe>

wüsste jetzt nicht wie ich das anders bzw. einfacher umsetzen kann als mein Ansatz momentan, für andere möglichkeiten/wege bin ich natürlich offen
Und ob ich die if umkehre oder nicht bleibt sich eigentlich gleich, brauche ja eh beide ausgaben, habe halt mit der leichteren begonnen ^^

mfg Spikaner
 
Der XPath-Ausdrücke würden so lauten:
Code:
//recipe[@craft_area]
//recipe[not(@craft_area)]
Aber wie gesagt, ich glaube, dass dir das viel bringt.

Das Umkehren der IF-Bedingung war wie folgt gemeint:
Code:
if (blablub) {
blablub
blablub
blablub
blablub
blablub
blablub
}
else {
  blub // Nur ein Befehl!
}

Sauberer:
Code:
if (!blablub) {
  blub // Nur ein Befehl!
  return;
}

blablub
blablub
blablub
blablub
blablub
blablub
 
@ComFreek Werde ich mir zu Herzen nehmen.
jetzt noch eine Frage zu der Ausgabe
wie löse ich am besten die Ausgabe in einer Tabelle.
2G5PabE.jpg

Das array schaut wie folgt aus

Code:
0, 0array(10) {
  [0]=>
  string(6) "-1, -1"
  [1]=>
  string(5) "0, -1"
  [2]=>
  string(5) "1, -1"
  [3]=>
  string(5) "-1, 0"
  [4]=>
  string(4) "0, 0"
  [5]=>
  string(4) "2, 2"
  [6]=>
  string(5) "-1, 2"
  [7]=>
  string(4) "0, 2"
  [8]=>
  string(4) "1, 2"
  [9]=>
  string(4) "2, 2"
}
Ich muss ja das ganze irgendwie sortiert bekommen und die "leerstände" auch befüllen.

mfg Spikaner
 
Zuletzt bearbeitet:
Zurück