Christian: XML-Element finden

Guten Morgen Forum!

Ich möchte prüfen ob ein bestimmter Wert in einer XML-Datei steht.

Ich dachte es funktioniert so

  
// $xmlstr = Inhalt der XML  
$xmlstr = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>  
<colors>  
    <color>  
        <name>Orange</name>  
        <ton1>Rot</ton1>  
        <ton2>Gelb</ton2>  
    </color>  
    <color>  
        <name>Braun</name>  
        <ton1>Rot</ton1>  
        <ton2>Gruen</ton2>  
    </color>  
</colors>';  
$xml = new SimpleXMLElement($xmlstr);  
// Wenn 'Gruen' im Array $xml  
if(in_array('Gruen', $xml)) /* tu irgendwas */;  

hab mich aber geirrt. Es kommt folgender Fehler:
´<b>Warning</b>:  in_array() [<a href='function.in-array'>function.in-array</a>]: Wrong datatype for second argument in (usw.)´

Was wäre also der richtige Weg?
Im PHP-Manual steht nur, wie man _alle_ Daten eines Wertes suchen kann. Ich möchte aber heraus finden ob ein bestimmter Wert überhaupt existiert. Muss ich trotzdem eine foreach()-Schlefe benutzen oder gibt es etwas ähnliches wie in_array() für den Fall.

Danke für eure Hilfe!

Christian

  1. Ich möchte prüfen ob ein bestimmter Wert in einer XML-Datei steht.

    Was wäre also der richtige Weg?
    Im PHP-Manual steht nur, wie man _alle_ Daten eines Wertes suchen kann. Ich möchte aber heraus finden ob ein bestimmter Wert überhaupt existiert. Muss ich trotzdem eine foreach()-Schlefe benutzen oder gibt es etwas ähnliches wie in_array() für den Fall.

    Moment, in_array bezieht sich doch auf einen ARRAY und new SimpleXML ist ein Objekt. Wenn dann müsstest du vorher alle relevanten Daten in ein Array packen und diesen dann mit in_array durchsuchen.

    1. Hallo!

      Moment, in_array bezieht sich doch auf einen ARRAY und new SimpleXML ist ein Objekt. Wenn dann müsstest du vorher alle relevanten Daten in ein Array packen und diesen dann mit in_array durchsuchen.

      Ich hatte mich gewundert warum print_r() trotzdem funktioniert aber hatte das "print_r(), var_dump() und var_export() zeigen mit PHP 5 auch private und geschützte Eigenschaften von Objekten an." noch nicht gelesen.

      Mit welcher Funktion pack ich colors in ein Array?

      Christian

    2. Hallo!

      Moment, in_array bezieht sich doch auf einen ARRAY und new SimpleXML ist ein Objekt. Wenn dann müsstest du vorher alle relevanten Daten in ein Array packen und diesen dann mit in_array durchsuchen.

      Ich hab es jetzt so probiert
      $hackstack = get_object_vars($xml);
      if(in_array('Gruen', $hackstack)) /* tu was */;

      Das funktioniert aber immer noch nicht weil der Inhalt jetzt zwar kein Object mehr sondern ebend ein Array ist, aber immer noch Objecte enhält. Wenn ich diese noch in Arrays umwandeln will muss ich doch eine Schleife schreiben oder?

      Danke für deine Hilfe!

      Christian

      1. Hi,

        Wenn ich diese noch in Arrays umwandeln will muss ich doch eine Schleife schreiben oder?

        AFAIR sind im PHP-Manual entsprechende Umwandlungsfunktionen von Usern gepostet worden.

        Ich persönlich parse entweder gar nicht (kleine Funktion auf Basis der Stringfunktionen, die mir XML-Elemente ausschneidet), oder ich verwende die "großen" XML-Funktionen, da ich ohnehin PHP-4-kompatibel coden muß und SimpleXML eh nur bis zu einer gewissen Tiefe überhaupt funktioniert (was es für mich unbrauchbar macht). Generell ist die XML-Funktionalität in PHP 5 arg buggy geraten, und hat mich schon manche Stunde gekostet ...

        Gruß, Cybaer

        --
        Man kann doch sehr leicht jenen tugendhaften Menschen begegnen, (...) die eine Art "unkrümmbaren Zeigefinger" besitzen, der ständig den kalten Wind des Rechthabens ausströmt. (Wolfgang Huber, Bischof)
        Die Tugend jagt nicht den Teufel, sondern den Sündhaften. Damit wird sie zum Terror. (Hans-Ulrich Jörges, Journalist)
        1. Hallo!

          Wenn ich diese noch in Arrays umwandeln will muss ich doch eine Schleife schreiben oder?

          AFAIR sind im PHP-Manual entsprechende Umwandlungsfunktionen von Usern gepostet worden.

          Die Schleife krieg ich schon hin, ich halte es nur für arg umständlich den kompletten Inhalt der XML einzulesen und in einer Schleife jeden Wert zu prüfen ob er mit dem von mir gegebenen Wert übereinstimmt.
          in_array() wäre so schön gewesen :(

          Ich persönlich parse entweder gar nicht (kleine Funktion auf Basis der Stringfunktionen, die mir XML-Elemente ausschneidet), oder ich verwende die "großen" XML-Funktionen, da ich ohnehin PHP-4-kompatibel coden muß und SimpleXML eh nur bis zu einer gewissen Tiefe überhaupt funktioniert (was es für mich unbrauchbar macht). Generell ist die XML-Funktionalität in PHP 5 arg buggy geraten, und hat mich schon manche Stunde gekostet ...

          Was meinst du denn mit den "großen" XML-Funktionen?
          Die DOM XML Funktionen?
          Nun, da steht
          "Diese Erweiterung ist EXPERIMENTELL. Das Verhalten dieser Erweiterung, einschließlich der Funktionsnamen, und alles Andere was hier dokumentiert ist, kann sich in zukünftigen PHP-Versionen ohne Ankündigung ändern. Seien Sie gewarnt und verwenden Sie diese Erweiterung auf eigenes Risiko."

          Solange das dort steht, würd ich gern darauf verzichten.

          Danke für deine Hilfe!

          Christian

          1. Hi,

            ich halte es nur für arg umständlich den kompletten Inhalt der XML einzulesen und in einer Schleife jeden Wert zu prüfen ob er mit dem von mir gegebenen Wert übereinstimmt.

            So ist es aber.

            in_array() funktioniert halt nicht mit multi-dimensionalen Arrays. Aber in den User-Kommentaren zu dem Befehl findest Du auch ein in_array_multi().

            Wenn man alles erstmal hat, ist es ziemlich problemlos ...

            Was meinst du denn mit den "großen" XML-Funktionen?
            Die DOM XML Funktionen?

            Nein, den XML-Parser (expat).

            Expat ist recht kompliziert, DOM ist einfacher, SimpleXML noch einfacher.

            Gruß, Cybaer

            --
            Man kann doch sehr leicht jenen tugendhaften Menschen begegnen, (...) die eine Art "unkrümmbaren Zeigefinger" besitzen, der ständig den kalten Wind des Rechthabens ausströmt. (Wolfgang Huber, Bischof)
            Die Tugend jagt nicht den Teufel, sondern den Sündhaften. Damit wird sie zum Terror. (Hans-Ulrich Jörges, Journalist)
  2. echo $begrüßung;

    Ich möchte prüfen ob ein bestimmter Wert in einer XML-Datei steht.
    Was wäre also der richtige Weg?

    Zumindest _ein_ Weg ist XPath. Siehe http://de.selfhtml.org/xml/darstellung/. Lässt sich auch auf SimpleXML-Objekte über die Methode xpath() anwenden.

    echo "$verabschiedung $name";