Ankündigung

Einklappen
Keine Ankündigung bisher.

XML-String mit Namespaces in PHP korrekt in Objekt parsen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • XML-String mit Namespaces in PHP korrekt in Objekt parsen

    Hallo,
    ich mache einen CALL zu einer API. Dazu benutze ich CURL und bekomme als Response einen XML-String. Das XML ist genau das, was ich von der API auch als antwort erwarte.


    Das ist mein Code für den CURL Call:
    Code:
      
    $curl = curl_init($this->api_base . $this->endpoint);  
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC );
    curl_setopt($curl, CURLOPT_USERPWD, $this->getAuthString());  
    curl_setopt($curl, CURLOPT_FAILONERROR, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, false);  
    curl_setopt($curl, CURLOPT_HTTPHEADER, [     'Content-Type: application/xml',     'Accept: application/xml',     'Connection: Keep-Alive' ]);      
    $response = curl_exec($curl);
    $curl_error = curl_error($curl);
    curl_close($curl);

    Ich erhalte folgendes XML als String:

    Code:
    <!--?xml version="1.0" encoding="UTF-8" standalone="yes"?-->
    <search:search-result xmlns:seller="http://services.mobile.de/schema/seller" xmlns:ad="http://services.mobile.de/schema/ad" xmlns:search="http://services.mobile.de/schema/search" xmlns:financing="http://services.mobile.de/schema/common/financing-1.0" xmlns:resource="http://services.mobile.de/schema/resource" xmlns:error="http://services.mobile.de/schema/common/error-1.0">
        <search:total>2</search:total>
        <search:page-size>20</search:page-size>
        <search:current-page>1</search:current-page>
        <search:max-pages>1</search:max-pages>
        <search:ads>
            <ad:ad key="263518873" url="https://services.mobile.de/search-api/ad/1234">
                <ad:creation-date value="2018-06-14T10:07:33+02:00">
                ...
        </search:ads>
    </search:search-result>
    ich habe schon diverse Möglichkeiten versucht, das nun zu parsen und als Objekt weiter zu verarbeiten... leider ohne Erfolg...

    PHP-Code:
      simplexml_load_string($response
    wenn ich mir das Ergebnis davon als var_dump ausgeben lasse, erhalte ich nur:
    Code:
    object(SimpleXMLElement)#839 (0) { }
    Habe dann gelesen, man muss das mit Namespaces anders machen
    Code:
      
    define('XMLNS_AD', 'http://services.mobile.de/schema/ad');
    define('XMLNS_SEARCH', 'http://services.mobile.de/schema/search');    
    foreach ( simplexml_load_string($response)->list->children(XMLNS_SEARCH)->item as $item) {    
        echo 'Item: ' . (string)$item . "\n";
    }
    aber da bekomm ich aus der Schleife gar keine Ausgabe...



    wie mach ich das korrekt?

  • #2
    zB Google ("php simplexml namespace") weiß darüber zB das hier:

    http://php.net/manual/de/simplexmlel...hnamespace.php bzw. https://stackoverflow.com/a/622363

    oder du nimmst DOMDocument zB https://www.itsalif.info/content/php...mespace-part-1
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Hallo hausl ,
      ich habe schon versucht diverse Beispiele und Tutorials auf meinen Fall anzuwenden, bin jedoch gescheitert... deshalb frage ich ja als letzten Ausweg hier und erhoffe mir eine Lösung die nicht nur ein Beispiel ist, sondern zu meinem Fall passt...

      Mit dem DomDocument komm ich leider auch nicht zurecht... ich kriegs nicht hin, dass das XML darin landet...

      Kommentar


      • #4
        Code:
         
         <!--?xml version="1.0" encoding="UTF-8" standalone="yes"?-->
        Das ist kein gültiger XML Kopf... was haben die HTML-Kommentarzeichen (!-- ... --) da drin zu suchen?
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Dein XML Beispiel oben ist nicht valide. Bitte ein valides Beispiel zeigen. Kommentar zu Beginn, nicht geschlossene Elemente etc..
          The string "()()" is not palindrom but the String "())(" is.

          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            Code:
            
            <!--?xml version="1.0" encoding="UTF-8" standalone="yes"?-->
            <search:search-result xmlns:seller="http://services.mobile.de/schema/seller" xmlns:ad="http://services.mobile.de/schema/ad" xmlns:search="http://services.mobile.de/schema/search" xmlns:financing="http://services.mobile.de/schema/common/financing-1.0" xmlns:resource="http://services.mobile.de/schema/resource" xmlns:error="http://services.mobile.de/schema/common/error-1.0">   
                <search:total>2</search:total> 
                <search:page-size>20</search:page-size>
                <search:current-page>1</search:current-page>
                <search:max-pages>1</search:max-pages>
                <search:ads>
                    <ad:ad key="263518873" url="https://services.mobile.de/search-api/ad/1234">
                        <ad:creation-date value="2018-06-14T10:07:33+02:00">
                        ...
                    </ad:ad>
                </search:ads>
            </search:search-result>

            Kommentar


            • #7
              Immer noch nicht valide.

              https://wiki.selfhtml.org/wiki/XML/R...ML-Deklaration

              Die XML-Deklaration ist also eine besondere, alleinstehende Auszeichnung, deren erstes und letztes Zeichen innerhalb der spitzen Klammern < und > ein Fragezeichen ? ist. Unmittelbar hinter dem Anfangsfragezeichen muss xml (kleingeschrieben) stehen.
              Kontaktiere den Hersteller der API und weise ihn auf die Ungültigkeit des XML hin...
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar

              Lädt...
              X