php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 23.07.2007, 11:34  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard 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
Igäl ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 23.07.2007, 13:46  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

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...
Igäl ist offline  
Alt 23.07.2007, 14:05  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

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.
Zergling-new ist offline  
Alt 23.07.2007, 14:14  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

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?
Igäl ist offline  
Alt 23.07.2007, 14:56  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard Re: Abbruch mitten im Script (XML - Parsing)

Zitat:
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.
nikosch ist gerade online  
Alt 23.07.2007, 15:03  
Erfahrener Benutzer
 
Registriert seit: 16.08.2007
Beiträge: 702
PHP-Kenntnisse:
Anfänger
Igäl befindet sich auf einem aufstrebenden Ast
Standard

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
Igäl ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Readfile: Abbruch mitten im Download bei großer Datei Melchior PHP Tipps 2006 8 14.06.2006 14:35
Script beendet sich ohne Fehlermeldung Zahl PHP Tipps 2006 6 04.06.2006 20:41
Script abbruch -> warum? Newan PHP Tipps 2006 28 14.03.2006 14:23
passwort script problem PHP Tipps 2006 8 15.02.2006 10:30
[Erledigt] Verzögerung durch included Script? Umgehen? PHP Tipps 2005-2 4 10.07.2005 19:26
[Erledigt] Relay Script PHP-Fortgeschrittene 11 01.06.2005 16:02
[Erledigt] Hilfe bei Download Verwaltungs Script PHP Tipps 2005 8 04.05.2005 10:29
Fehler bei Script, welches Ordner erstellt PsychoEagle PHP Tipps 2005 3 23.04.2005 16:03
[Erledigt] python script mit php aufrufen... PHP-Fortgeschrittene 1 17.11.2004 17:11
Abbruch bei Aufruf von ImageFunktion PHP-Fortgeschrittene 27 07.11.2004 21:43
PHP Script aus PHP aufrufen Stümper PHP Tipps 2004 5 26.09.2004 08:15
"das" Script oder "der" Script?? Simbo Off-Topic Diskussionen 31 16.09.2004 17:04
Script bricht mitten in einer while Schleife ab PHP Tipps 2004 5 11.07.2004 17:16

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
provisionertragskonto, php xml parser abbruch, php abbruch bei großer xml datei, xml_parse und umlaute, artikel brechen mitten im text ab, lager-ist-voll-php-script, xml parser umlaute brechen um, xml html mitten im text, script bricht vor umlaut ab

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:42 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.