Ankündigung

Einklappen
Keine Ankündigung bisher.

XML in MySql-DB

Einklappen

Neue Werbung 2019

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

  • XML in MySql-DB

    Hallo,

    ich bin gerade am verzweifeln. Ich möchte eine XML-Datei auslesen und in eine MySql-DB schreiben:

    Die XML ist so aufgebaut, aber Price-Elemente macht mir zu schaffen???
    PHP-Code:
    <catalog>
    <
    products>
    <
    produkt>
    <
    Product_id>12345</Product_id>
    <
    Desc>12345</Desc>
    <
    Prices>
    <
    Price>
    <
    menge>100</menge><Price>0.865</Price></Price>
    <
    Price><menge>300</menge><Price>0.815</Price></Price>
    <
    produkt>
    </
    products>
    </
    catalog
    Und das Script, was die Datei ausliest und in die DB schreibrt sieht so
    PHP-Code:
    if (file_exists($xmlFile)) {
        
    $xml simplexml_load_file($xmlFile);

       foreach(
    $xml->Products->Product as $article)
            {
            
    $abfrage "INSERT INTO table (Product_Id,Desc) 
            VALUES ('"
    .$article->Product_Id."','".$article->Desc."') 
            ON DUPLICATE KEY UPDATE Product_Id='"
    .$article->Product_Id."', Desc='".$article->Desc."' ";
        
    $ergebnis mysql_query($abfrage);
             }
    }   else {echo 
    "Fehler: ".$datei."\n";} 
    Product_Id und Desc bekomme ich in die DB, aber alle Versuche die Unterelemente prices in die DB zu bekommen sind kläglich gescheitert.

    In der DB sollen die Felder m1 mit der ersten "<menge>", m2 mit der zweiten "<menge>" usw. aus der XML-Datei übertragen werden.

    Hat jemand vielleicht einen Ansatz? Danke im voraus!!!

  • #2
    Ja, das Stichwort nennt sich Normalisierung. Ja niemals Tabellenspalten durchnummerieren, das ist broken-by-design.

    Erstelle eine neue Tabelle "prices (product_id, quantity, price)" wo du die Preise für die Produkte speicherst.
    [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

    Kommentar


    • #3
      OK, nur leider ist das in diesem Fall nicht so einfach möglich. Und ausserdem soll von der Datei auch noch eine CSV-Datei erstellt werden und da habe ich dann ja das gleiche Problem mit den verschachtelten Elementen, oder?

      Es muss doch eine Möglichkeit geben die XML-Daten trotzdem in die Tabelle zu bekommen.

      Ich habe schon versucht in die INSERT-query eine foreach-Schleife einzubauen, aber das hat leider nicht geklappt...

      Kommentar


      • #4
        Postgres kann XML verarbeiten. Und "nicht einfach so möglich" ist eine faule Ausrede.
        [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

        Kommentar


        • #5
          "Ist nicht so einfach möglich" ist keine faule Ausrede, sondern Tatsache weil die Anwendung jahrelang läuft und nicht ohne Weiteres zu ändern ist.

          Das XML kann ich, wie beschrieben auch verarbeiten, tue mich jedoch mit den verschachtelten Knoten schwer.

          Über hilfreiche Kommentare würde ich mich freuen.

          Kommentar


          • #6
            Nunja, dann hat die Anwendung seit Jahren ein kaputtes Design. Dann wird es erst recht Zeit, das zu beheben.

            Du kannst über die Knoten iterieren (XPath) und dabei einen Query dynamisch zusammenstellen. Vorkauen werde ich dir das nicht - das erwarte ich als Eigeninitiative. Insbesondere kann ich kein schlechtes Design unterstützen, das passt mir nicht in den Kopf .
            [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

            Kommentar


            • #7
              Dein hier gezeigtes XML wimmelt nur so von Schreibfehlern, ist dadurch invalide und passt auch nicht zu gezeigten Codeschnipsel. Das macht es nicht leicht zu helfen, etwas mehr Sorgfalt wäre angebracht.
              Vom Grundsatz brauchst du eine zweites foreach über Price innerhalb der $article. Packe das Ergebnis am besten in ein Array. Bei der Benutzung von XPath mußt du aufpassen, da du gleiche Namen in unterschiedlichen Ebenen hast (Price). Hab schon bessere XML-Strukturen gesehen.

              Kommentar


              • #8
                Danke jspit, genau den Ansatz brauchte ich...manchmal sitzt man halt zu dicht vorm Bildschirm...

                Eine zusätzliche foreach, in ein array und dann dynamisch!!!

                Vielen Dank!!!

                PHP-Code:
                (file_exists($xmlFile)) {
                    
                $xml simplexml_load_file($xmlFile);
                   foreach(
                $xml->Products->Product as $article)
                        {
                        
                $items = array();
                                foreach ( 
                $article->Prices->Price as $child )  
                        {
                            
                $items[] = $child->Start
                        } 
                        
                $abfrage "INSERT INTO... 

                Kommentar


                • #9
                  XML in MySql-DB

                  Ja, genau so sieht schlechte Software-Architektur aus
                  [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                  Kommentar

                  Lädt...
                  X