Ankündigung

Einklappen
Keine Ankündigung bisher.

Suche Hilfe beim Script zum Parsen für XML

Einklappen

Neue Werbung 2019

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

  • Scriptsuche Suche Hilfe beim Script zum Parsen für XML

    Moin,

    ich benötige/suche Hilfe damit ich die XML-Datei parsen und dann die Daten / Feldinhalte in eine Datenbank schreiben kann. Irgendwie stehe ich auf dem Schlauch, was das Parsen von XML-Dateien angeht.
    Die Hilfe soll nicht für lau sein, bin gerne bereit dafür jemanden auch einen Obolus dafür zu zahlen. Ich muss „nur“ einmal wissen, wie ich das Grundscript schreiben muss. Die Ergänzung um weitere Felder / Inhalte sollte ich dann schon schaffen ;=)

    Worum geht es:
    So sieht das im Frontend aus: https://www.myrcm.ch/myrcm/report/de...294565?key=203
    Das hier sind die Rohdaten als XML, die geparst werden sollen: https://www.myrcm.ch/myrcm/report/de...=203&cType=XML

    Das Gleiche / Ähnliche hier noch einmal.
    Frontend: https://www.myrcm.ch/myrcm/report/de...294565?key=100
    XML: https://www.myrcm.ch/myrcm/report/de...=100&cType=XML

    Rückfragen gerne auch per PN


    Greetz
    TheStormer

  • #2
    https://www.php.net/manual/de/domdocument.loadxml.php

    Kommentar


    • #3
      echt jetzt ?

      ich nehme an du nutzt mysql TheStormer ?
      dann schau mal das an:
      https://dev.mysql.com/doc/refman/8.0/en/load-xml.html

      üblicherweise greift man per xpath auf xml elemente zu, zum transformieren nutzt man xslt

      Kommentar


      • #4
        Ich hatte mal Lust meine TableArray Klasse mit der XML von #1 zu testen. Die XML sieht angedeutet so aus:
        PHP-Code:
        <Participants>
          <
        Metadata>
              <
        Version>2</Version>
         :
           </
        Metadata>
           <
        PilotList>
                <
        Pilot Key="3372" Name="....."/>
                <
        Pilot Key="3354" N
           
        </PilotList>
        </
        Participants
        TableArray benötigt ein XML-String. Als zweiter Parameter kann ein XPath-String übergeben werden. Das wird hier auch genutzt. Der Code :

        PHP-Code:
        $fileName __DIR__."/../test/data/pilot.xml";  //Pfad anpassen
        $strXML simplexml_load_file($fileName);
        $xmlTableArray TableArray::createFromXml($strXML,'//Pilot')
           ->
        fetchAll()

        Dieser Aufruf liefert dann ein Array der Form:

        PHP-Code:
        array (
          
        =>
          array (
            
        '@attributes' =>
            array (
              
        'Key' => "3372",
              
        'Name' => 
        Dieses Array ist 3-dimensional. Optimal für eine DB wäre ein Array ohne die Ebene '@attributes'. Die Klasse hat dafür eine Methode welche alle 'Childs' einsammelt welche über bestimmte Schlüssel verfügen.
        Mit

        PHP-Code:
        $xmlTableArray TableArray::createFromXml($strXML,'//Pilot')
          ->
        collectChilds(['Key','Name'])
          ->
        fetchAll()

        bekomme ich ein zum Speichern in einer DB optimales Array:
        PHP-Code:
        array (
          
        =>
          array (
            
        'Key' => "3372",
            
        'Name' => "GA.. 
        TheStormer Die Klasse kannst du dir gerne bei https://github.com/jspit-de/TableArr...TableArray.php kostenfrei runterladen. Alle weiteren Probleme must du selbst lösen.

        Kommentar


        • #5
          Zitat von jspit Beitrag anzeigen
          ->collectChilds(['Key','Name'])
          Kleiner Tipp am Rande: "Childs" gibt es nicht. Es gibt nur Child oder Children.

          Kommentar


          • #6
            Moin,

            ich hatte das ja erst nicht geglaubt und als „typische Forenantwort“ gesehen: „Hey, bist du blind, geht doch ganz einfach“ ;=))
            Funktioniert aber im Moment wunderbar und ist auch echt einfach zu bedienen. Sind ja auch nicht so großen Datenmengen und es ist nicht zeitkritisch.
            Danke funzt ;=)

            Greetz
            TheStormer

            Kommentar


            • #7
              Moin,

              so, bis jetzt hat alles gut geklappt, aber an die Objekte komme ich nicht mit DOM, also ich nicht Irgendwelche guten Ideen?

              Code:
              <tree id="0" radio="0">
              <Metadata>
              <Version>2</Version>
              <DataType/>
              <EventData Key="B18D6AD101C2FA628002"/>
              <ReportData ReportKey="302" SectionKey="36"/>
              <License SerialCode="1637874590" AccessCode="9572-106C-20F5-EF3E"/>
              </Metadata>
              <item text="Gruppe 1" id="1" im0="iconWrite1.gif">
              <item text="Training" id="19980" im0="leaf.gif"/>
              <item text="Vorlauf 1" id="19981" im0="iconWrite1.gif"/>
              <item text="Vorlauf 2" id="19982" im0="iconWrite1.gif"/>
              <item text="Vorlauf 3" id="19983" im0="iconWrite1.gif"/>
              <item text="Vorlauf 4" id="19984" im0="iconWrite1.gif"/>
              </item>
              <item text="Gruppe 2" id="2" im0="iconWrite1.gif">
              <item text="Training" id="19985" im0="leaf.gif"/>
              <item text="Vorlauf 1" id="19986" im0="iconWrite1.gif"/>
              <item text="Vorlauf 2" id="19987" im0="iconWrite1.gif"/>
              <item text="Vorlauf 3" id="19988" im0="iconWrite1.gif"/>
              <item text="Vorlauf 4" id="19989" im0="iconWrite1.gif"/>
              </item>
              <item text="Gruppe 3" id="3" im0="iconWrite1.gif">
              <item text="Training" id="19990" im0="leaf.gif"/>
              <item text="Vorlauf 1" id="19991" im0="iconWrite1.gif"/>
              <item text="Vorlauf 2" id="19992" im0="iconWrite1.gif"/>
              <item text="Vorlauf 3" id="19993" im0="iconWrite1.gif"/>
              <item text="Vorlauf 4" id="19994" im0="iconWrite1.gif"/>
              </item>
              </tree>

              Kommentar


              • #8
                Dir fehlt möglicherweise nur noch eine Kleinigkeit, damit alles klar wird: XPath

                PHP-Code:
                <?php
                $xml 
                = <<<DATA
                <tree id="0" radio="0">
                    <Metadata>
                        <Version>2</Version>
                        <DataType/>
                        <EventData Key="B18D6AD101C2FA628002"/>
                        <ReportData ReportKey="302" SectionKey="36"/>
                        <License SerialCode="1637874590" AccessCode="9572-106C-20F5-EF3E"/>
                    </Metadata>
                    <item text="Gruppe 1" id="1" im0="iconWrite1.gif">
                        <item text="Training" id="19980" im0="leaf.gif"/>
                        <item text="Vorlauf 1" id="19981" im0="iconWrite1.gif"/>
                        <item text="Vorlauf 2" id="19982" im0="iconWrite1.gif"/>
                        <item text="Vorlauf 3" id="19983" im0="iconWrite1.gif"/>
                        <item text="Vorlauf 4" id="19984" im0="iconWrite1.gif"/>
                    </item>
                    <item text="Gruppe 2" id="2" im0="iconWrite1.gif">
                        <item text="Training" id="19985" im0="leaf.gif"/>
                        <item text="Vorlauf 1" id="19986" im0="iconWrite1.gif"/>
                        <item text="Vorlauf 2" id="19987" im0="iconWrite1.gif"/>
                        <item text="Vorlauf 3" id="19988" im0="iconWrite1.gif"/>
                        <item text="Vorlauf 4" id="19989" im0="iconWrite1.gif"/>
                    </item>
                    <item text="Gruppe 3" id="3" im0="iconWrite1.gif">
                        <item text="Training" id="19990" im0="leaf.gif"/>
                        <item text="Vorlauf 1" id="19991" im0="iconWrite1.gif"/>
                        <item text="Vorlauf 2" id="19992" im0="iconWrite1.gif"/>
                        <item text="Vorlauf 3" id="19993" im0="iconWrite1.gif"/>
                        <item text="Vorlauf 4" id="19994" im0="iconWrite1.gif"/>
                    </item>
                </tree>
                DATA;

                $doc = new DOMDocument();
                $doc->loadXML($xml);

                $domXPath = new DOMXPath($doc);

                printf("/tree/@id: %s\n"$domXPath->evaluate('string(/tree/@id)'));
                printf("/tree/@radio: %s\n"$domXPath->evaluate('string(/tree/@radio)'));

                // Macro
                $printXpath fn($xpath) => printf("%s: %s\n"$xpath$domXPath->evaluate("string($xpath)"));

                $printXpath('/tree/Metadata/Version');
                $printXpath('/tree/Metadata/DataType');
                $printXpath('/tree/Metadata/EventData/@Key');
                $printXpath('/tree/Metadata/ReportData/@ReportKey');
                $printXpath('/tree/Metadata/ReportData/@SectionKey');
                $printXpath('/tree/Metadata/License/@SerialCode');
                $printXpath('/tree/Metadata/License/@AccessCode');

                $nodes $domXPath->query('/tree/item');

                $printItem = static function (DOMElement $nodeint $indent) use ($domXPath) {
                    
                $text $node->getAttribute('text');
                    
                $id   $node->getAttribute('id');
                    
                $im0  $node->getAttribute('im0');
                    
                printf("%sItem: %s / %s / %s\n"str_repeat('    '$indent), $text$id$im0);
                };

                foreach(
                $nodes as $node) {
                    
                $printItem($node0);

                    
                $childNodes $domXPath->query('./item'$node); // Achtung, zweiter Parameter - "relativ zu Node"

                    
                foreach($childNodes as $childNode) {
                        
                $printItem($childNode1);
                    }
                }
                Das sind nur ein paar Grundkniffe. XPath ist eine ziemlich mächtige Sprache.

                Kommentar


                • #9
                  Zitat von rkr Beitrag anzeigen

                  Kleiner Tipp am Rande: "Childs" gibt es nicht. Es gibt nur Child oder Children.
                  Es gibt auch den Begriff "childs": https://en.wiktionary.org/wiki/childs

                  Kommentar


                  • #10
                    Zitat von CPCoder Beitrag anzeigen
                    Es gibt auch den Begriff "childs": https://en.wiktionary.org/wiki/childs
                    Primarily used in dialogue, to indicate that a foreign or illiterate speaker has a poor grasp of the English language. Occasionally used for simple comedic effect.

                    Kommentar


                    • #11
                      hellbringer

                      ... Occasionally used for simple comedic effect.

                      Kommentar


                      • #12
                        Ich hoffe das Ziel ist nicht, dass der Code eine Lachnummer ist . Von daher würde eich einfach nur von einem simplen Schreibfehler ausgehen und nicht von einer Absicht.

                        Kommentar

                        Lädt...
                        X