[Coder gesucht] XML-Element(e) auslesen mit PHP4

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

  • [Coder gesucht] XML-Element(e) auslesen mit PHP4

    Hi.

    Ich hab mir den Rat bzw. den Link (www.php.net), den ich hier IMMER zu hören bzw. zu sehen bekommen, wenn ich newbhafte Fragen stelle, letztlich zu Herzen genommen und STUNDENLANG copy&past-haft etwas zusammengecodet, was nun tatsächlich auch funktioniert. Zwar bin ich nun schlauer als vorher; aber nicht so schlau, um folgendes Problem in PHP-Code umzusetzen:

    Z. Zt. holt sich das Script das erste <FormattedPrice>-Element in der XML-Datei - das ist auch für diese Abfrage immer dasjenige, das ich brauche. Ich möchte nun aber in einer Abfrage zwei <FormattedPrice>-Elemente speichern. Das Problem ist, das die Anzahl der <FormattedPrice>-Elemente variiert; manchmal sind's zwei, mal drei usw. Anders als im ersten Fall, bringt mir das preg_match in dieser Form wenig. Das zweite Element, das ich brauche, ist aber immer in folgender Struktur versteckt:
    Code:
    <Price>
    <Amount>2095</Amount>
    <CurrencyCode>EUR</CurrencyCode>
    <FormattedPrice>EUR 20,95</FormattedPrice>
    </Price>
    Wie krieg ich das (i.e. den Preis samt "EUR" zwischen <FormattedPrice>) jetzt da raus? Wäre wirklich fein, wenn mir jemand helfen könnte!

    Das besagte (halb fertige) Script:
    PHP-Code:
    <?php

    function get_remote_file($url)
    {
        if (
    ini_get('allow_url_fopen')) {
            return 
    file_get_contents($url);
        }
        elseif (
    function_exists('curl_init')) {
            
    $c curl_init($url);
            
    curl_setopt($cCURLOPT_RETURNTRANSFER1);
            
    curl_setopt($cCURLOPT_HEADER0);
            
    $file curl_exec($c);
            
    curl_close($c);
            return 
    $file;
        }
        else {
            die(
    'Error');
        }
    }

    include 
    "includes/connect.php";

    $getitems="SELECT itemid,asin from phpbb_amazon";

    $getitems2=mysql_query($getitems) or die("Could not get items");

    while(
    $getitems3=mysql_fetch_array($getitems2))

    {

      
    $url="http://webservices.amazon.de/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=$acckey
    &Operation=ItemLookup&ItemId=
    $getitems3[asin]&ResponseGroup=Medium,Offers&Condition=All&MerchantID=All";

      
    $var=get_remote_file($url);

      
    $regex '/\<FormattedPrice\>EUR ([0-9]+?,?[0-9]*?)<\/FormattedPrice\>/';
      
      
    preg_match($regex,$var,$match);

      
    $price $match[1];

      print 
    "$price<br>";

      
    $updatecron="Update phpbb_amazon set price='$price' where itemid='$getitems3[itemid]'";

      
    mysql_query($updatecron) or die("Could not update cron");

      
    mysql_query("Delete from bgook");

    }

    ?>
    Zuletzt geändert von baerenwurm; 30.07.2008, 00:02.

  • #2
    preg_match_all hilft dir sicherlich...

    Kommentar


    • #3
      Und wie berücksichtige ich da die Zeilenumbrüche zwischen <Price> & <Amount> usw.?

      Kommentar


      • #4
        Dein Script funktioniert doch bis jetzt, wenn du nur 1x etwas haben willst oder?

        Da hast du die Zeilenumbrüche auch nicht berücksichtigt (steht zwar auch nirgends, aber naja...^^)

        mfg

        Kommentar


        • #5
          Bei der ersten Abfrage muss ich die Zeilenumbrüche nicht berücksichtigen, da der erste Wert, den ich haben will, immer derjenige ist, der zwischen dem ersten <FormattedPrice>-Element vorkommt.

          Anders beim zweiten Wert bzw. Preis. Der steht zwar immer ganz unten; die Anzahl der <FormattedPrice>-Elemente zwischen den ersten und den letzten variiert aber, d.h. ich kann nicht einfach den 2. oder 3. Wert abfragen. Ich muss denjenigen Wert zwischen <FormattedPrice> abfragen, der sich zwischen den <Price>-Elementen (kommt nur einmal vor) befindet, abfragen.

          Zur Veranschaulichung:

          Code:
          <OfferSummary>
          −
          [b]// Der LowestNewPrice steht immer oben; wenn's den nicht gibt, steht der LowestUsedPrice oben;
          in jedem Fall derjenige Preis, den ich als erstes haben will.[/b]
          <LowestNewPrice>
          <Amount>2695</Amount>
          <CurrencyCode>EUR</CurrencyCode>
          <FormattedPrice>EUR 26,95</FormattedPrice>
          </LowestNewPrice>
          −
          <LowestUsedPrice>
          <Amount>2134</Amount>
          <CurrencyCode>EUR</CurrencyCode>
          <FormattedPrice>EUR 21,34</FormattedPrice>
          </LowestUsedPrice>
          −
          <LowestCollectiblePrice>
          <Amount>2850</Amount>
          <CurrencyCode>EUR</CurrencyCode>
          <FormattedPrice>EUR 28,50</FormattedPrice>
          </LowestCollectiblePrice>
          <TotalNew>14</TotalNew>
          <TotalUsed>3</TotalUsed>
          <TotalCollectible>2</TotalCollectible>
          <TotalRefurbished>0</TotalRefurbished>
          </OfferSummary>
          −
          <Offers>
          <TotalOffers>1</TotalOffers>
          <TotalOfferPages>1</TotalOfferPages>
          −
          <Offer>
          −
          <Merchant>
          <MerchantId>blabla</MerchantId>
          −
          <GlancePage>
          [url]http://www.amazon.de/gp/help/seller/home.html?seller=bla[/url]
          </GlancePage>
          </Merchant>
          −
          <OfferAttributes>
          <Condition>New</Condition>
          <SubCondition>new</SubCondition>
          </OfferAttributes>
          −
          <OfferListing>
          −
          <OfferListingId>
          bla
          </OfferListingId>
          −
          [b]// Ganz unten steht immer der (Amazon-)<Price>; den will ich als zweiten in meiner MySQL-Tabelle haben. [/b]
          <Price>
          <Amount>3097</Amount>
          <CurrencyCode>EUR</CurrencyCode>
          <FormattedPrice>EUR 30,97</FormattedPrice>
          </Price>
          <Availability>Gewöhnlich versandfertig bei Amazon in 24 Stunden</Availability>
          <IsEligibleForSuperSaverShipping>1</IsEligibleForSuperSaverShipping>
          </OfferListing>
          </Offer>
          </Offers>

          Kommentar


          • #6
            Dein Problem wird von Antwort zu Antwort komplizierter
            Dachte immer, dass es andersrum sein sollte ^^..

            http://regexp-evaluator.de/evaluator...6d94/#ergebnis

            Da haste eine Idee für einen Regex...

            mfg

            Kommentar


            • #7
              Fein, klappt tadellos

              Kommentar


              • #8
                Hab doch noch was vergessen

                Wie kann ich einen Text, z.B. "nicht verfügbar" anzeigen lassen, wenn er nix finden sollte? (Das war's dann aber wirklich.)

                Kommentar


                • #9
                  Je nach dem, welchen Code du genommen hast:

                  Sagen wir $matches beinhaltet die Treffer:

                  PHP-Code:
                  if(count($matches) == 0) echo "no result"

                  Kommentar


                  • #10
                    Danke! Kann ich die "no result"-Ausgabe auch als Variable definieren, um sie -statt dem Preis - in der MySQL-Tabelle abspeichern zu können?

                    Kommentar


                    • #11
                      Versuchs?
                      Das solltest du denk ich auch alleine hinbekommen...

                      mfg

                      Kommentar


                      • #12
                        Ok, danke für deine Hilfe!

                        Kommentar


                        • #13
                          Nicht unbedingt eine Heldentat, aber ich hab's hinbekommen:

                          PHP-Code:
                            if(count($matchbest) == 0){

                            
                          $pricebest "ausverkauft";

                            }else{

                            
                          $pricebest $matchbest[1];
                            
                            } 

                          Kommentar


                          • #14
                            XML sollte man normalerweise besser mit XML-Funktionen an den Kragen gehen und nicht per Regex!

                            Kommentar


                            • #15
                              Hi.

                              Seit Amazon eine Signatur beim Abfragen von Preisen u.a. verlangt, kann ich mein altes regex-Skript nicht mehr benutzen.

                              Habe nun versucht, das hier irgendwie mit Teilen meines alten Skripts zu verbinden.

                              Leider werden die Werte nicht in meine MySQL-Datenbank übertragen ($updatecron):

                              PHP-Code:
                              <?php

                              include "includes/connect.php"// Datenbank-Login

                              include "aws_signed_request.php"// PHP-Funktion

                              $getitems="SELECT itemid,asin from phpbb_amazon";

                              $getitems2=mysql_query($getitems) or die("Could not get items");

                              while(
                              $getitems3=mysql_fetch_array($getitems2))

                              {

                              $pxml aws_signed_request("de", array("Operation"=>"ItemLookup","ItemId"=>$getitems3[asin],"ResponseGroup"=>"OfferSummary","Condition"=>"All","MerchantID"=>"All"), $public_key$private_key);
                              if (
                              $pxml === False)
                              {
                                  echo 
                              "Siehe Shop";
                              }
                              else
                              {
                                  if (isset(
                              $pxml->Items->Item->OfferSummary->LowestNewPrice->FormattedPrice))
                                 {
                                      echo 
                              $pxml->Items->Item->OfferSummary->LowestNewPrice->FormattedPrice"\n";
                                  }
                                 else
                                 {
                                      echo 
                              $pxml->Items->Item->OfferSummary->LowestUsedPrice->FormattedPrice"\n";
                                 }
                              }


                                
                              $updatecron="Update phpbb_amazon set price='$pxml' where itemid='$getitems3[itemid]'";

                                
                              mysql_query($updatecron) or die("Could not update cron");

                                
                              mysql_query("Delete from bgook");

                              }

                              ?>
                              Kann mir irgendwer helfen? Bin mir sicher, dass es für euch ziemlich offensichtlich sein muss, was an dem dilettantisch zusammenkopierten Code falsch ist...

                              Kommentar

                              Lädt...
                              X