PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   Projekthilfe (https://www.php-resource.de/forum/projekthilfe/)
-   -   [Coder gesucht] XML-Element(e) auslesen mit PHP4 (https://www.php-resource.de/forum/projekthilfe/93164-coder-gesucht-xml-element-e-auslesen-mit-php4.html)

baerenwurm 30-07-2008 00:00

[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! http://www.quentintarantino.de/images/smiles/lib.gif

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");

}

?>


Blackgreetz 30-07-2008 00:56

preg_match_all hilft dir sicherlich...

baerenwurm 30-07-2008 01:01

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

Blackgreetz 30-07-2008 01:05

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

baerenwurm 30-07-2008 01:32

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>

// 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.

<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>
http://www.amazon.de/gp/help/seller/...tml?seller=bla
</GlancePage>
</Merchant>

<OfferAttributes>
<Condition>New</Condition>
<SubCondition>new</SubCondition>
</OfferAttributes>

<OfferListing>

<OfferListingId>
bla
</OfferListingId>

// Ganz unten steht immer der (Amazon-)<Price>; den will ich als zweiten in meiner MySQL-Tabelle haben.
<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>


Blackgreetz 30-07-2008 01:50

Dein Problem wird von Antwort zu Antwort komplizierter :rolleyes:
Dachte immer, dass es andersrum sein sollte ^^..

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

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

mfg

baerenwurm 30-07-2008 01:59

Fein, klappt tadellos http://www.quentintarantino.de/images/smiles/lib.gif http://www.quentintarantino.de/images/smiles/lib.gif http://www.quentintarantino.de/images/smiles/lib.gif

baerenwurm 30-07-2008 02:07

Hab doch noch was vergessen :rolleyes:

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

Blackgreetz 30-07-2008 02:36

Je nach dem, welchen Code du genommen hast:

Sagen wir $matches beinhaltet die Treffer:

PHP-Code:

if(count($matches) == 0) echo "no result"


baerenwurm 30-07-2008 02:55

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

Blackgreetz 30-07-2008 02:56

Versuchs?
Das solltest du denk ich auch alleine hinbekommen...

mfg

baerenwurm 30-07-2008 03:07

Ok, danke für deine Hilfe!

baerenwurm 30-07-2008 03:23

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

PHP-Code:

  if(count($matchbest) == 0){

  
$pricebest "ausverkauft";

  }else{

  
$pricebest $matchbest[1];
  
  } 

;)

PHP-Desaster 30-07-2008 08:42

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

baerenwurm 09-09-2009 00:29

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...


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:21 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG