Ankündigung

Einklappen
Keine Ankündigung bisher.

Abbruch mitten im Script (XML - Parsing)

Einklappen

Neue Werbung 2019

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

  • Abbruch mitten im Script (XML - Parsing)

    Hallo Leute

    Bin grad etwas am verzweifeln, da eines meiner Scripte, dass ich auf einen Spezialfall umrüsten wollte letzte Woche funktioniert hat, und es diese Woche nicht mehr tut.

    Es handelt sich hierbei um das Script, mit welchem ich ein XML-File parsen will, ein Feld extrahiere, die beiden Sprachen die darin enthalten sind trenne und ein neues XML-File schreibe, in welchem nur noch der eindeutige Bezeichner und die Felder für die beiden Sprachen drin sind.

    Im Gegensatz zu letzter Woche bricht der Parser aber heute das Parsing ohne (für mich) ersichtlichen Grund ab. Nachfolgend nochmals mein Script:
    PHP-Code:
    <?php
    error_reporting
    (E_ALL);
    /********************************************************/
    class Artikel    {
        protected 
    $parser;
        protected 
    $elemArr = array();
        private 
    $dom_obj;
        private 
    $n_xml_data = array(); //Daten welche ich später verarbeiten will, werden hier gespeichert
        
    private $cnt 0;

        public function 
    __construct()    {
            
    $this->dom_obj $this->generate_dom_doc();        //Ein neues DOM - Objekt mit XML - Header erzeugen

            
    $this->parser xml_parser_create();

            
    xml_set_object($this->parser$this);
            
    xml_set_element_handler($this->parser'startElement''endElement');
            
    xml_set_character_data_handler($this->parser'characterData');
        }

        public function 
    __destruct()    {
            
    xml_parser_free($this->parser);
        }

        public function 
    readCatalog($catalog)    {
            
    xml_parse($this->parserfile_get_contents($catalog), true);
        }

        protected function 
    startElement($parser$element$attributes)    {
            
    array_push($this->elemArr$element);
        }

        protected function 
    endElement($parser$element)    {
            
    array_pop($this->elemArr);
        }

        protected function 
    characterData($parser$cdata)    {
            switch(
    $this->elemArr[sizeof($this->elemArr)-1])    {
                case 
    "AUTOM_ARTIKELNR":    $this->fill_arr("Autom_ArtikelNr"$cdata);
                                        break;
                case 
    "MEMO":            $this->fill_arr("Memo"$cdata);
                                        break;
                case 
    "MABBEGD":            $this->fill_arr("MABBegD"$cdata);
                                        break;
                case 
    "MABENDD":            $this->fill_arr("MABEndD"$cdata);
                                        break;
                case 
    "MABBEGF":            $this->fill_arr("MABegF"$cdata);
                                        break;
                case 
    "MABENDF":            $this->fill_arr("MAEndF"$cdata);
                                        
    $this->cnt++;
                                        break;
            }
        }

        private function 
    fill_arr($field$cdata)    {
            if(!empty(
    $this->n_xml_data[$this->cnt][$field]))    {
                
    $this->n_xml_data[$this->cnt][$field] .= $cdata;
            }else{
                
    $this->n_xml_data[$this->cnt][$field] = $cdata;
            }
        }

        private function 
    generate_dom_doc()    {
            
    $dom = new DOMDocument("1.0");
            
    header("Content-Type: text/plain");

            return 
    $dom;
        }

        public function 
    insert_data()    {
            
    $art_root $this->dom_obj->createElement("ArtikelRoot");
            
    $this->dom_obj->appendChild($art_root);

            for(
    $i=0;$i<count($this->n_xml_data);$i++)    {
                
    $d_text "";
                
    $f_text "";
                if(!empty(
    $this->n_xml_data[$i]['Memo']))    {
                    
    $memo_arr explode("\n"$this->n_xml_data[$i]['Memo']);
                }
                
                
    $artikel $this->dom_obj->createElement("Artikel");
                
    $art_root->appendChild($artikel);

                
    //ArtikelNr in die Struktur einfügen
                
    $a_nr $this->dom_obj->CreateElement("Autom_ArtikelNr");
                
    $artikel->appendChild($a_nr);

                
    $art_nr $this->dom_obj->createTextNode($this->n_xml_data[$i]['Autom_ArtikelNr']);
                
    $a_nr->appendChild($art_nr);

                if(!empty(
    $this->n_xml_data[$i]['Memo']))    {
                    
    //Deutsche Memo in die Struktur einfügen
                    
    $memo_d $this->dom_obj->CreateElement("MemoD");
                    
    $artikel->appendChild($memo_d);
                    
                    for(
    $d=$this->n_xml_data[$i]['MABBegD'];$d<=$this->n_xml_data[$i]['MABEndD'];$d++)    {
                        
    $d_text .= !empty($memo_arr[$d]) ? $memo_arr[$d] : "\n";
                    }

                    
    $text_d $this->dom_obj->createTextNode($d_text);
                    
    $memo_d->appendChild($text_d);
                    
                    
    //Französische Memo in die Struktur einfügen
                    
    $memo_f $this->dom_obj->createElement("MemoF");
                    
    $artikel->appendChild($memo_f);

                    for(
    $f=$this->n_xml_data[$i]['MABegF'];$f<=$this->n_xml_data[$i]['MAEndF'];$f++)    {
                        
    $f_text .= !empty($memo_arr[$f]) ? $memo_arr[$f] : "\n";
                    }

                    
    $text_f $this->dom_obj->createTextNode($f_text);
                    
    $memo_f->appendChild($text_f);
                }
            }
        }

        public function 
    show_file()    {
            echo 
    $this->dom_obj->saveXML();
        }
    }
    /********************************************************/
    /********************************************************/
    $artikel = new Artikel;

    $artikel->readCatalog("Small.xml");
    $artikel->insert_data();
    $artikel->show_file();                                //Generiertes File anzeigen

    /********************************************************/
    /********************************************************/
    ?>
    Und hier noch der erste Datensatz des XML-Files um die Struktur klar zu machen:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2007-07-23T07:32:50">
    <Artikel>
    <Autom_ArtikelNr>291</Autom_ArtikelNr>
    <ArtikelNr>#100.080</ArtikelNr>
    <BezeichnungD1>Kleiner Text</BezeichnungD1>
    <Zaunmakt>0</Zaunmakt>
    <Trad>Ja, ok</Trad>
    <BezeichnungD2>Mittlerer Text</BezeichnungD2>
    <VP2>0</VP2>
    <EPbewertet>0</EPbewertet>
    <BezeichnungD3>Kleiner Text</BezeichnungD3>
    <BezeichnungF1>Kleiner Text</BezeichnungF1>
    <BezeichnungF2>Kleiner Text</BezeichnungF2>
    <BezeichnungF3>Kleiner Text</BezeichnungF3>
    <MengenEinheitD>m1</MengenEinheitD>
    <MengenEinheitF>m</MengenEinheitF>
    <Verkaufseinheit>1</Verkaufseinheit>
    <aktiv>1</aktiv>
    <EPaktuell>0</EPaktuell>
    <EPmix>0</EPmix>
    <VP1>0</VP1>
    <Lagerbestand>0</Lagerbestand>
    <Reserviert>0</Reserviert>
    <Verkauft>0</Verkauft>
    <Anfangsbestand>0</Anfangsbestand>
    <Mindestbestand>0</Mindestbestand>
    <MinBestellmenge>0</MinBestellmenge>
    <Bestellt>0</Bestellt>
    <Maximalbestand>0</Maximalbestand>
    <IdealBestand>0</IdealBestand>
    <Gewicht>0</Gewicht>
    <Bruttogewicht>0</Bruttogewicht>
    <LagerVerbuchung>1</LagerVerbuchung>
    <Rabattgewähren>1</Rabattgewähren>
    <UmsatzActiv>0</UmsatzActiv>
    <AktionActiv>0</AktionActiv>
    <iRabattActiv>0</iRabattActiv>
    <MgRabattActiv>0</MgRabattActiv>
    <MwstCode>USt76</MwstCode>
    <Provision>0</Provision>
    <ErtragsKonto>3200</ErtragsKonto>
    <Bearbeitung>2007-04-23T00:00:00</Bearbeitung>
    <Memo>
    Grosser Text Deutsch
    Möglicherweise mehrzeilig
    
    und teilweise sogar mit Absatz
    
    Grosser Text Französisch
    Möglicherweise mehrzeilig
    
    und teilweise sogar mit Absatz
    <MemoAlsBez>1</MemoAlsBez>
    <MABBegD>1</MABBegD> /*Zeile aus Memo, in welcher der deutsche Text beginnt*/
    <MABEndD>4</MABEndD> /*Zeile aus Memo, in welcher der deutsche Text endet*/
    <MABBegF>6</MABBegF> /*Zeile aus Memo, in welcher der französische Text beginnt*/
    <MABEndF>10</MABEndF> /*Zeile aus Memo, in welcher der französische Text endet*/
    <MABBegE>0</MABBegE>
    <MABEndE>0</MABEndE>
    <LiefPKNr>0</LiefPKNr>
    </Artikel>
    </dataroot>
    Wenn ich nun mein Script durchlaufen lasse, bricht er immer nach "<BezeichnungF1>Kleiner Text</BezeichnungF1>" ab und gibt das File aus. Ich habe keine Idee wieso, ausser dass er vielleicht einfach Französisch nicht mag. Allerdings halte ich das für unwahrscheinlich.

    Hat irgendeiner eine Idee, woran es liegen könnte? Ich blick langsam nicht mehr durch.

    Herzlichen Dank

    Gruss Igäl
    Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit.
    Mark Twain


  • #2
    Kann mir jemand sagen, was einen Parser dazu veranlassen könnte, nur die Hälfte aller Felder auszulesen? Das ist eigentlich das Problem. Es werden nicht alle Felder geparsed...
    Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit.
    Mark Twain

    Kommentar


    • #3
      Ein Syntax-Fehler im XML-Dokument, sehe aber grade keinen.
      Bin auch gerade mit Kubuntu aufm Laptop online, da habe ich XAMPP noch nicht installiert, kann es also gerade nicht selbst testen.

      Kommentar


      • #4
        xml_error_string() gibt aus "No Memory" und der Errorcode der mit der entsprechenden Funktion ausgegeben wurde ergibt den Errorcode 9 was gemäss Doku "XML_ERROR_DUPLICATE_ATTRIBUTE" bedeutet... Also ja.. sofern Errorcode 1 zu oberst und dann nach unten fortlaufend ist...

        Ists vielleicht möglich, dass das File gleich heissen muss, wie das Wurzelelement oder was weiss ich?
        Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit.
        Mark Twain

        Kommentar


        • #5
          Re: Abbruch mitten im Script (XML - Parsing)

          Zitat von Igäl
          Im Gegensatz zu letzter Woche bricht der Parser aber heute das Parsing ohne (für mich) ersichtlichen Grund ab. Nachfolgend nochmals mein Script:
          Warum muß ich bei solchen Aussagen nur immer grinsen. Ich glaube ich habe noch nie einen Fall in diesem Forum gelesen, wo es im Endeffekt dann nicht doch auf menschliches Versagen hinausgelaufen ist.

          Nächstesmal das xml File einfach mal direkt im Browser öffnen:

          Es fehlt das schließende Memo Tag. Wenn der Code nicht wirklich utf-8 war wurde mir zusätzlich auch der Umlaut im Tag <Rabattgewähren> angemeckert.
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Katastrophe. Das hab ich voll übersehen. Aber eigentlich habe ich das File gar nicht modifiziert. Wobei ich aber auch nicht glaube, dass das direkt so ausm Access rausgekommen ist... Merkwürdig.

            Danke Nikosch. Jetzt hats auch für mich einen ersichtlichen Grund... Aber dann stimmt weder die Ausgabe von xml_error_string() noch Errorcode 9 (wenn ich das richtig interpretiert habe)
            Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit.
            Mark Twain

            Kommentar

            Lädt...
            X