POST XML Output Parsen

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

  • POST XML Output Parsen

    Hallo Zusammen,

    ich hab nun ein Problem mit dem xml parsen eines soap Output.

    Ich habe per HTTP Post Request XML Daten abgefragt.

    Aber ich kann diese per xml_parser_create, xml_parse_into_struct nicht parsen.

    Im index und im vals, keine Daten. Nur ein leeres Array.

    Hier mal ein Code Ausschnitt.
    Hier der XML Output...Ein Ausschnitt:


    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/xml;charset=utf-8
    Date: Mon, 01 Dec 2008 11:54:50 GMT
    Transfer-Encoding: chunked
    Connection: close
    Set-Cookie: JSESSIONID=511001C2EBD78C0A159728FA4B335798; Path=/arsys
    Age: 0

    fb2
    <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org
    /2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body><ns0:OpGetIncidentResponse xmlns:ns0="urn4_InfidentTester"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org
    /2001/XMLSchema-instance">
    <ns0:T_application/>
    <ns0:T_asset_id/>
    <ns0:T_assigned_to/>
    <ns0:T_assignee_group>AS-GENERY-3RD</ns0:T_assignee_group>
    <ns0:T_assignment_counter>1</ns0:T_assignment_counter>
    <ns0:T_case_id/>......


    PHP-Code:
    $xml_parser xml_parser_create();
                
    xml_parse_into_struct($xml_parser$postdata$vals$index);
                
    xml_parser_free($xml_parser);
                echo 
    "Index array<br>";
                
    print_r($index);
                echo 
    "\nVals array<br>";
                
    print_r($vals); 
    Danke
    gruss pedro

  • #2
    keine hilfe?

    Kennt sich den nkeiner aus damit?

    Kommt schon Kollegen, dass kann ja wohl nicht sein? g*


    Gruss
    gruss pedro

    Kommentar


    • #3
      Geduld ist immer ein guter Ratgeber in einem Forum

      Wie setzt du den Soap-Request ab bzw. wie nimmst du die Daten entgegen? Manuell oder mit den Soap-Bord-Mitteln von PHP?

      Der Response den du gepostet hast kommt ja in transfer-encoding: chunked daher - evtl. liegt da dein Problem?
      Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
      Schön - etwas Geschichte kann ja nicht schaden.
      Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

      Kommentar


      • #4
        Transfer-Encoding: chunked

        ja der request kommt eben im Transfer-Encoding: chunked. kann ich ja nix dran ändern oder?


        Oder muss ich mich erstmal belesen, was das genau gedeutet?

        ich sende denn Request so:

        Ausschnitt:

        PHP-Code:
        //$raw array für header
        $raw = array();
                    
        $raw[] = "POST [url]http://deapviap.de.pri.o2.com:8088/arsys/services[/url]
        /ARService?server=deapviap&webService=o2_IncidentReader HTTP/1.1\r\n"
        ;
                    
        $raw[] = "Content-Type: text/xml;charset=UTF-8\r\n";
                    
        $raw[] = "SOAPAction: \"urn:o2_IncidentReader/OpGetIncident\"\r\n";
                    
        $raw[] = "User-Agent: Jakarta Commons-HttpClient/3.1\r\n";
                    
        //Standard Proxy
                    
        $raw[] = "Host: {$hostproxy}\r\n";
                    
        //data array für post daten
                    
        $data = array();
                    
        $data[] = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org
        /soap/envelope/\" xmlns:urn=\"urn:o2_IncidentReader\">\r\n"
        ;
                    
        $data[] = "<soapenv:Header>\r\n";
                    
        $data[] = "<urn:AuthenticationInfo>\r\n";
                    
        $data[] = "<urn:userName>{$ARS->userLogin}</urn:userName>\r\n";
                    
        $data[] = "<urn:password>{$ARS->userPassword}</urn:password>\r\n";
                    
        $data[] = "</urn:AuthenticationInfo>\r\n";
                    
        $data[] = "</soapenv:Header>\r\n";
                    
        $data[] = "<soapenv:Body>\r\n"

        Die PHP SOAP Klasse nehme ich nicht. Daran hab ich mir Stundenlang die Zähne ausgebissen.

        Hier bekomme ich nichtmal ne Connection hin??

        Daher dieser unfeine Weg ;o(
        gruss pedro

        Kommentar


        • #5
          per php soap

          Per SOAP Klasse wärs mir eh lieber, aber geht net ;o(

          per php soap bekomme ich folgendes...


          PHP-Code:
          $client = new SoapClient('o2_IncidentReader.wsdl');
          $res $client->__soapCall("OpGetIncident",array("userName""xxx""password""xxx""Request-ID""IMG000000123456")); 
          SoapFault exception: [HTTP] Could not connect to host in /home/adriang/public_html
          /workspace/candy/www/testi_adriang.php:10 Stack trace: #0 [internal function]:
          SoapClient->__doRequest('__soapCall('OpGetIncident', Array) #2 {main}
          gruss pedro

          Kommentar


          • #6
            Ist die wsdl auf nem entfernten Server? Dann musst natürlich alles mit http://..... beginnend bis zur wsdl angeben.
            Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
            Schön - etwas Geschichte kann ja nicht schaden.
            Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

            Kommentar


            • #7
              ich hab mir da per http request ne datei gezogen, von de rich dachte das wäre die wsdl datei.

              diese hab ich bei mir lokal gespeichert. so steure ich diese nun an.
              gruss pedro

              Kommentar


              • #8
                Warning: SoapClient::__construct(http://server.de.pri.o2.com:8088/ars...IncidentReader) [function.--construct]: failed to open stream: Connection timed
                out in /home/adrianf/public_html/www/testi_adrianf.php on line 9


                Warning: SoapClient::__construct() [function.--construct]: I/O warning : failed to load external
                entity "http://server.de.pri.o2.com:8088/arsys/WSDL/public/server/o3_IncidentReader" in
                /home/adrianf/public_html/workspace/testi_adrianf.php on line 9
                SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from
                'http://server.de.pri.o2.com:8088/arsys/WSDL/public/server/o3_IncidentReader' in
                /home/adrianf/public_html/workspace/testi_adrianf.php:9 Stack trace: #0
                /home/adrianf/public_html/workspace/testi_adrianf.php(9):
                SoapClient->__construct('http://server...') #1 {main}

                ...server ist nur ein platzhalter!!! werte abgeändert!
                gruss pedro

                Kommentar


                • #9
                  allgemeiner Tipp:
                  Hier im Forum unter dem Eingabefeld "Urls automatisch umwandeln" deaktivieren und "Grafische Smilies deaktivieren" aktivieren <-

                  hmm - also bei deinem Problem mit den Soap-Funktionen seh ich jetzt auch auf Anhieb nichts.

                  Nochmal die Frage: Wie setzt du den Request ab? fsockopen, deinen Request senden und dann die Resource auslesen? Falls ja, musst du dich noch ums zusammensetzen des Response kümmern wenn er chunked ausgeliefert wird.

                  Oder einfach mit Curl deinen Request absenden...
                  Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                  Schön - etwas Geschichte kann ja nicht schaden.
                  Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                  Kommentar


                  • #10
                    ja per fsockopen

                    ja per fsockopen, sorry...stand auf de Leitung...

                    naja curl geht nicht, hab ich shcon versucht, die soap Schnittstelle nimmt die Daten nicht per GET an.

                    Also Roh xml Daten hab ich nun, für die denen das viell. auch hilft.

                    PHP-Code:
                    $start = strpos($post,'<?xml');
                    $end = strrpos($post,'>');   
                    $postdata = substr($post,$start,$end-$start+1);
                    Zu finden bei php.net

                    Was ich nicht verstehe, wozu das
                    PHP-Code:
                    $end-$start+
                    sein soll? $end reicht anscheinend aus.
                    Zumindest sehe ich im Quelltext keinen Unterschied.

                    Jetzt aber was merkwürdiges?

                    Wenn ich den xml Output parse und per Foreach drüber gehe, kommt er nur bis zum dritten Array... (Es sollten aber um die 159 sein?) und als erstes kommt ein Array ausserhalb der Key Values. Liegt das an dem gesendeten Chunk Output? Oder was ist hier los?

                    PHP-Code:
                    Array
                    (
                        [
                    tag] => SOAPENV:ENVELOPE
                        
                    [type] => open
                        
                    [level] => 1
                        
                    [attributes] => Array
                            (
                                [
                    XMLNS:SOAPENV] => [url]http://schemas.xmlsoap.org/soap/envelope/[/url]
                                
                    [XMLNS:XSD] => [url]http://www.w3.org/2001/XMLSchema[/url]
                                
                    [XMLNS:XSI] => [url]http://www.w3.org/2001/XMLSchema-instance[/url]
                            
                    )

                    )
                    <
                    br>KEY0-1<br>Array
                    (
                        [
                    tag] => SOAPENV:BODY
                        
                    [type] => open
                        
                    [level] => 2
                    )
                    <
                    br>KEY1-1<br>Array
                    (
                        [
                    tag] => NS0:OPGETINCIDENTRESPONSE
                        
                    [type] => open
                        
                    [level] => 3
                        
                    [attributes] => Array
                            (
                                [
                    XMLNS:NS0] => urn:32_IncidentReader
                                
                    [XMLNS:XSD] => [url]http://www.w3.org/2001/XMLSchema[/url]
                                
                    [XMLNS:XSI] => [url]http://www.w3.org/2001/XMLSchema-instance[/url]
                            
                    )

                        [
                    value] => 
                        
                    )
                    <
                    br>KEY2-1<br>Array
                    (
                        [
                    tag] => NS0:T_APPLICATION
                        
                    [type] => complete
                        
                    [level] => 4
                    )
                    <
                    br>KEY3-1<br
                    gruss pedro

                    Kommentar


                    • #11
                      Re: ja per fsockopen

                      Original geschrieben von petro_0
                      naja curl geht nicht, hab ich shcon versucht, die soap Schnittstelle nimmt die Daten nicht per GET an.
                      http://de.php.net/manual/en/function.curl-setopt.php

                      Ja - es wird an dem Response liegen, der im Transfer-Encoding-Chunked daherkommt. Wie gesagt - erst musst du den Response zusammensetzen bevor du ihn weiterverarbeitest.

                      Oder eben gleich curl nehmen - das kümmert sich für dich drum.
                      Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                      Schön - etwas Geschichte kann ja nicht schaden.
                      Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                      Kommentar


                      • #12
                        habs

                        so konnte mir helfen...

                        es lag nun an meinem parser, der nach dem echo in der foreach blödsinn gemacht hat. somit blieb der foreach nach dem 3, 4 Durchlauf stecken.

                        Erst ein
                        PHP-Code:
                        error_reporting(E_ALL E_STRICT); 
                        zeigte mir denn Fehler...

                        Habs nun wie folgt gelöst:

                        PHP-Code:
                        if($post) {
                                    //this part removes stuff
                                    $start = strpos($post,'<?xml');
                                    $end = strrpos($post,'>');   
                                    $postdata = substr($post,$start,$end-$start+1);

                                    $xml_parser = xml_parser_create();
                                    xml_parse_into_struct($xml_parser, $postdata, $vals);
                                    xml_parser_free($xml_parser);

                                    foreach ($vals as $k => $xml_elem) {
                                        $this->level[$xml_elem['tag']] = $xml_elem['value'];
                                    }
                                    return $this->level;
                                }
                        chunked war nicht das problem, sondern mein parser!
                        gruss pedro

                        Kommentar

                        Lädt...
                        X