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
 

spikaner

Quereinsteiger @ php
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

spikaner

Quereinsteiger @ php
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
 

ComFreek

Mod | @comfreek
Moderator
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.
 

spikaner

Quereinsteiger @ php
@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

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
 

ComFreek

Mod | @comfreek
Moderator
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
 

spikaner

Quereinsteiger @ php
@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.

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: