XML-Parsen - kleines Problem

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

  • XML-Parsen - kleines Problem

    Hallo!

    Ich möchte eine XML-Datei parsen, die aus 10 einzelnen Sets besteht.
    Diese Datei sieht im Grunde so aus:

    ---
    <?xml version="1.0" encoding="UTF-8"?><ProductInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xyz.xsd">
    <Details url="http://www.amazon.de/exec/obidos/ASIN/B000055Z95">
    <Asin>B000055Z95</Asin>
    <ProductName>Projekt: Peacemaker</ProductName>
    <Catalog>DVD</Catalog>
    <ReleaseDate>22. August 2002</ReleaseDate>
    <Manufacturer>Universal/4 Front Video</Manufacturer>
    <ImageUrlSmall>http://images-eu.amazon.com/images/P...3.THUMBZZZ.jpg</ImageUrlSmall>
    <ImageUrlMedium>http://images-eu.amazon.com/images/P...3.MZZZZZZZ.jpg</ImageUrlMedium>
    <ImageUrlLarge>http://images-eu.amazon.com/images/P...3.LZZZZZZZ.jpg</ImageUrlLarge>
    <ListPrice>EUR 0,00</ListPrice>
    <OurPrice>EUR 9,99</OurPrice>
    <UsedPrice>EUR 4,99</UsedPrice>
    </Details>
    <Details url="http://www.amazon.de/exec/obidos/ASIN/B00005UMYY">
    <Asin>B00005UMYY</Asin>
    <ProductName>Memento (2 DVDs)</ProductName>
    <Catalog>DVD</Catalog>
    <ReleaseDate>09. Juli 2002</ReleaseDate>
    <Manufacturer>Columbia Tristar Home Video</Manufacturer>
    <ImageUrlSmall>http://images-eu.amazon.com/images/P...3.THUMBZZZ.jpg</ImageUrlSmall>
    <ImageUrlMedium>http://images-eu.amazon.com/images/P...3.MZZZZZZZ.jpg</ImageUrlMedium>
    <ImageUrlLarge>http://images-eu.amazon.com/images/P...3.LZZZZZZZ.jpg</ImageUrlLarge>
    <ListPrice>EUR 32,99</ListPrice>
    <OurPrice>EUR 28,99</OurPrice>
    <UsedPrice>EUR 39,99</UsedPrice>
    </Details>
    <Details url="http://www.amazon.de/exec/obidos/ASIN/B00005U51E">
    <Asin>B00005U51E</Asin>
    <ProductName>Mulholland Drive - Strasse der Finsternis</ProductName>
    <Catalog>DVD</Catalog>
    <ReleaseDate>02. Oktober 2002</ReleaseDate>
    <Manufacturer>Concorde Video</Manufacturer>
    <ImageUrlSmall>http://images-eu.amazon.com/images/P...3.THUMBZZZ.jpg</ImageUrlSmall>
    <ImageUrlMedium>http://images-eu.amazon.com/images/P...3.MZZZZZZZ.jpg</ImageUrlMedium>
    <ImageUrlLarge>http://images-eu.amazon.com/images/P...3.LZZZZZZZ.jpg</ImageUrlLarge>
    <ListPrice>EUR 19,99</ListPrice>
    <OurPrice>EUR 14,99</OurPrice>
    <UsedPrice>EUR 10,99</UsedPrice>
    </Details>
    <Details url="http://www.amazon.de/exec/obidos/ASIN/B00005OOJI">
    <Asin>B00005OOJI</Asin>
    <ProductName>Pioneer A-509-R Hifi-Verstärker schwarz</ProductName>
    <Catalog>Electronics</Catalog>
    <Manufacturer>Pioneer Electronics Deutschland GmbH</Manufacturer>
    <ImageUrlSmall>http://images-eu.amazon.com/images/P...3.THUMBZZZ.jpg</ImageUrlSmall>
    <ImageUrlMedium>http://images-eu.amazon.com/images/P...3.MZZZZZZZ.jpg</ImageUrlMedium>
    <ImageUrlLarge>http://images-eu.amazon.com/images/P...3.LZZZZZZZ.jpg</ImageUrlLarge>
    <ListPrice>EUR 0,00</ListPrice>
    <OurPrice>EUR 229,00</OurPrice>
    </Details>
    <Details url="http://www.amazon.de/exec/obidos/ASIN/B00004RYBA">
    <Asin>B00004RYBA</Asin>
    <ProductName>Fargo</ProductName>
    <Catalog>DVD</Catalog>
    <ReleaseDate>01. Juni 1998</ReleaseDate>
    <Manufacturer>Concorde Video</Manufacturer>
    <ImageUrlSmall>http://images-eu.amazon.com/images/P...3.THUMBZZZ.jpg</ImageUrlSmall>
    <ImageUrlMedium>http://images-eu.amazon.com/images/P...3.MZZZZZZZ.jpg</ImageUrlMedium>
    <ImageUrlLarge>http://images-eu.amazon.com/images/P...3.LZZZZZZZ.jpg</ImageUrlLarge>
    <ListPrice>EUR 24,99</ListPrice>
    <OurPrice>EUR 16,99</OurPrice>
    <UsedPrice>EUR 9,40</UsedPrice>
    </Details>
    <Details url="http://www.amazon.de/exec/obidos/ASIN/B00005YU8I">
    <Asin>B00005YU8I</Asin>
    <ProductName>Der amerikanische Soldat (2 DVDs)</ProductName>
    <Catalog>DVD</Catalog>
    <ReleaseDate>25. April 2002</ReleaseDate>
    <Manufacturer>EMS GmbH</Manufacturer>
    <ImageUrlSmall>http://images-eu.amazon.com/images/P...3.THUMBZZZ.jpg</ImageUrlSmall>
    <ImageUrlMedium>http://images-eu.amazon.com/images/P...3.MZZZZZZZ.jpg</ImageUrlMedium>
    <ImageUrlLarge>http://images-eu.amazon.com/images/P...3.LZZZZZZZ.jpg</ImageUrlLarge>
    <ListPrice>EUR 0,00</ListPrice>
    <OurPrice>EUR 22,99</OurPrice>
    <UsedPrice>EUR 17,99</UsedPrice>
    </Details>
    <Details url="http://www.amazon.de/exec/obidos/ASIN/B00014TQ7S">
    <Asin>B00014TQ7S</Asin>
    <ProductName>Franz Ferdinand</ProductName>
    <Catalog>Music</Catalog>
    <Artists>
    <Artist>Franz Ferdinand</Artist>
    </Artists>
    <ReleaseDate>16. Februar 2004</ReleaseDate>
    <Manufacturer>Domino (Rough Trade)</Manufacturer>
    <ImageUrlSmall>http://images-eu.amazon.com/images/P...3.THUMBZZZ.jpg</ImageUrlSmall>
    <ImageUrlMedium>http://images-eu.amazon.com/images/P...3.MZZZZZZZ.jpg</ImageUrlMedium>
    <ImageUrlLarge>http://images-eu.amazon.com/images/P...3.LZZZZZZZ.jpg</ImageUrlLarge>
    <ListPrice>EUR 13,99</ListPrice>
    <OurPrice>EUR 12,99</OurPrice>
    <UsedPrice>EUR 13,19</UsedPrice>
    </Details>
    .
    .
    .

    </ProductInfo>
    ---

    Nun möchte ich es aber so haben, dass ich die Werte entsprechenden Variablen zuweise.
    Als Beispiel (für $q=0) möchte ich das erste der zehn Erbenisse zuweisen:
    $topasin[$q]=[Wert der ersten ASIN]
    $topimage[$q]=[Wert aus dem ersten ImageUrlSmall]
    usw.
    danach $q++ und das zweite Ergebnis zuweisen, dann wieder $q++ und das dritte Ergebnis zuweisen.

    Wie stelle ich das am besten an?
    Ich habe es bisher so gemacht:

    //*****************************************
    function StartElement($parser, $name, $attrs) {
    global $identifier;
    $identifier=$name;
    }

    function EndElement($parser, $name) {
    global $set, $identifier, $data, $q, $topasin, $topimage, $toppreis, $topname, $debug, $errormsg;
    //echo $identifier." - ".$set[$identifier]."<br>";
    if (trim($identifier)=="ASIN")
    {
    $q++;
    $set["IMAGEURLSMALL"]="";
    $set["OURPRICE"]="";
    $set["ERRORMSG"]="";
    $set["PRODUCTNAME"]="";
    // Nicht benötigt
    $set["AVAILABILITY"]="";
    $set["LISTPRICE"]="";
    $set["USEDPRICE"]="";
    $set["IMAGEURLLARGE"]="";
    $set["IMAGEURLMEDIUM"]="";
    $set["MANUFACTURER"]="";
    $set["RELEASEDATE"]="";
    $set["AUTHOR"]="";
    $set["CATALOG"]="";
    //
    $topasin[$q]=trim(utf8_decode($set[$identifier]));
    }
    if ($debug=="1")
    {
    echo $identifier."<br>";
    echo $set[$identifier]."<br>";
    }
    if ($identifier=="ERRORMSG") $errormsg=trim(utf8_decode($set[$identifier]));
    if ($identifier=="PRODUCTNAME")
    {
    $topname[$q]=trim(utf8_decode($set[$identifier]));
    $topname[$q]=str_replace("&"," &amp; ",$topname[$q]);
    }
    if ($identifier=="IMAGEURLSMALL") $topimage[$q]=trim(utf8_decode($set[$identifier]));
    if ($identifier=="OURPRICE")
    {
    $toppreis[$q]=trim(utf8_decode($set[$identifier]));
    $toppreis[$q]=str_replace(",",".",$toppreis[$q]);
    $toppreis[$q]=str_replace("EUR ","",$toppreis[$q]);
    }
    }

    function CharacterData($parser, $data) {
    global $set, $identifier;
    $data=trim($data);
    if ($data && $identifier != "ASIN") $set[$identifier].=$data;
    elseif ($data && $identifier == "ASIN") $set[$identifier]=$data;
    }
    //***************************************************

    Irgendwie klappt das aber nicht immer richtig...
    Die Werte (außer ASIN) funktionieren auf diese Art und Weise ganz gut. Die ASIN hingegen wird teilweise leider abgeschnitten...

    Ich schätze mal, ich mache das sowieso viel zu kompliziert...

    Also, wer kann mir einen Tip geben, wie ich die Daten in entsprechende Arrays einlesen kann?

    SupervielenliebenDank!

    Gruß,
    Gerti
    Zuletzt geändert von Gerti; 28.05.2004, 21:46.

  • #2
    lösung

    hi,

    also ich hab die amazon-integration bei mir über mehrere scripts gelöst, und ein mir nicht sehr geläufiges teil namens nusoap.php realisiert.
    kleine anleitung : als erstes ( hast du sicher schon ) brauchst du dieses amazon developers-teil. interessant is dabei nur das PHPSample Verzeichniss. in diesem befinden sich 2 Dateien, die AmazonSearch.php und die amazon.php .die amazon.php is nützlich wenns um anwendungsbeispiele geht, die AmazonSearch.php is praktisch das backend.
    jetzt holst du dir unter http://dietrich.ganx4.com/nusoap/index.php die nusoap.php, haust die in den gleichen ordner wie die amazonSearch.php und siehe da, mit einem einfachen skript wie diesem :

    PHP-Code:
        set_time_limit(0);
        require(
    "./AmazonSearch.php");
        
    $Tag   '********************';
        
    $Token '********************';
        
    $AS = new AmazonSearch($Token$Tag$Debug);
        
    $SearchType 'lite';
        
    $results $AS->DoKeywordSearch($_GET['artist'] . " " $_GET['album'], $SearchType'music'2);
        echo 
    "<pre>";
        
    print_r($results);
        echo 
    "</pre>"
    kriegst du nen schönen Ergebniss-Array. wie oben schon gesagt, kannst dir aus der amazon.php die verschieden Typen ab bzw. angucken. in dem snippet oben musst du nohc dein dev-token und deinen tag einsetzen.

    gruß moritz

    Kommentar


    • #3
      Hi!

      Die Beispieltemplates kenne ich auch, sind mir aber zu umständlich gewesen. Daher bin ich ja den Weg über das einfach XML-Parsen gegangen.
      Ich habe jetzt noch die Tiefe der Elemente berücksichtigt und dieses in das Zusammensetzen der Daten einbezogen, nun scheint es zu funktionieren...
      ...aber trotzdem Danke für den Hinweis.

      Gruß,
      Gerti

      Kommentar

      Lädt...
      X