![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
|
Hallo, auf dem von mir gequälten Server ist php 4.3.4 installiert. Ich muss eine XML Datei importieren. Allerdings bin ich dabei auf etwas gestoßen wo ich nicht weiter weiß. In der Datei steht folgendes <zeit>13 & 15 Uhr</zeit> Komischerweise hat das Parsen nie richtig hingehauen, bzw. mein Ergebnis Array war immer Abgetrennt. Bei einer direkten Ausgabe krieg ich folgendes: falsch: ZEIT: 13 ZEIT: & ZEIT: 15 Uhr richtig sollte sein: ZEIT: 13 & 15 Uhr In meinem Ergebnis Array bekomme ich nur 15 Uhr. Der vordere Teil vom String ist abgehakt. Soweit ich weiß ist das ein Bug oder ähnliches Jedenfalls sorgt dieser Entity & für einen Umbruch, bzw. der Parser denkt es folgt ein weiterer gleicher Tag. Ich kann das & auch nicht umwandeln in & da die XML File ja dann nicht mehr valid ist. Die Datei ist UTF-8 Also wie kann ich dieses Phänomen umgehen? Ist es möglich weiterhin das mit dem PEAR XML Parser zu machen? Oder sollte ich auf die internen XML Funktionen von PHP4 umsteigen, was zur Folge hätte das ich den Parser fast nochmal neu schreiben müsste. Kann mir aber nicht vorstellen das es was hilft schließlich baut der PEAR XML Parser ja auf den PHP4 Funktionen auf. |
| | |
| | Nach oben #2 |
| Erfahrener Benutzer Registriert seit: 27.02.2006
Beiträge: 146
|
OK, geh drehe jetzt mal das Problem um, und lass die Frage nach dem Beispiel weg, obwohl es für die Problemlösung bei Dir dienlich wäre. Der XML_Parser trennt die Daten (cdata) nach verschiedenen Gesichtspunkten, insbesondere nach seinen eigenen Scan-Algorithmus. Auf diese Weise ist er in der Lage, die Inhalte nach den vorgefertigten Schemen zu bearbeiten. Da gehören dazu: &-Codes, #-Codes und Zeilenvorschübe. Für Dich heißt das, dass Du Deine Klasse so bauen musst, dass Du den Dateninhalt sauber zusammensetzen kannst. Wenn Du ein Beispiel dafür suchst, schau Dir Simple.php aus dem Paket an. Gruß, Jumper, the II. Geändert von JumperII (14.02.2007 um 11:22 Uhr). |
| | |
| | Nach oben #3 |
| Erfahrener Benutzer Registriert seit: 27.02.2006
Beiträge: 146
|
So, damit Du eine Lösung siehst .... File: 002.php PHP-Code: Code: <foo>
<bar>content of bar</bar>
<empty/>
<argh foo="bar">test</argh>
<zeit> 13 & 15 Uhr </zeit>
</foo>
Code: BAR: content of bar EMPTY: ARGH: test ZEIT: 13 & 15 Uhr FOO: Jumper, the II. |
| | |
| | Nach oben #4 |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
|
Ja und jetzt? Ich krieg mein Array aus der Klasse so schon wie ich es brauche. Problem ist das der Parser bei einem & meint der Tag ist zuende und es folgt darauf ein weiteres Element vom gleichen Typ. <zeit>13 & 15 Uhr</zeit> Der Parser meint es gäbe drei Elemente Zeit. Die Daten innerhalb des Tags werden in meinem Array gespeichert. Dadurch das er denkt es gibt 3 Elemente <Zeit> werden die vorherigen Daten des Zeit Elements überschrieben. In meinem Array steht dann [zeit] => 15 Uhr Da stimmt doch was nicht das der Parser & zum trennen benutzt. |
| | |
| | Nach oben #5 |
| Erfahrener Benutzer Registriert seit: 27.02.2006
Beiträge: 146
|
Falsch, wenn Du die Funktionalität des Parsers anders haben möchtest, musst Du ihn mit Deiner Erweiterung kapseln. Das ist alles. Im übrigen geht das Verhalten u.a. auf den guten alten SGML-Parser zurück. Gruß, Jumper, the II. |
| | |
| | Nach oben #6 |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
|
Also... Das heißt es ist normal das der Parser bei einem & so reagiert? Ich kann mir das irgendwie nicht vorstellen schließlich fängt ein <Element> so an und hört mit </Element> auf. Das das kfm. 'und' als entity einen ähnlichen Effekt erzielt verstehe ich nicht (erklärs mir). |
| | |
| | Nach oben #7 |
| Erfahrener Benutzer Registriert seit: 27.02.2006
Beiträge: 146
|
Es gibt für XML Parser an dieser Stelle keine allgemein verbindliche Aussage. Daher setzen die meisten sequentiell arbeitenden Parser (Streaming Parser) an dieser Stelle auf der abzuarbeitenden Grammatik auf. Bei dieser werden die verarbeitbaren Atome umgesetzt. D.h. für den cdata-Bereich, dass Plain Text von codes (mit & beginnend) z.b. getrennt werden. Wenn an dieser Stelle der von Dir gewünschte Speichereffekt auftreten soll, muss der Parser daher bereits Zustände und Daten vorhalten, so dass die Funktionsbeschreibung "sequentiell abarbeitender Parser" nicht mehr korrekt ist. Dabei werden natürlich untergeordnete Elemente und die Verarbeitung der cdata Elemente nicht berücksichtigt, d.h. diese können an dieser Stelle zusätzlich mit weiterführenden Sinnbedeutungen je nach vorliegenden Fall unzterschiedlich bewertet werden. Z.b. steht die Frage wie in <zeit> eingebettete weitere Tags auf den durch <zeit> begrenzte cdata reagieren soll. Ergo gibt es an dieser stelle keine universelle lösung und daher werden die einzelnen Elemente (durchaus typisch) so einzeln nacheinander angesprochen. Gruß, Jumper, the II. PS: Ist wie beim Starten eines Autos ... früher musste man den Schock ziehen, drei mal Gas treten und anschließend erst das auto anlassen. Der heutigen Automatisierung und Bequemlichkeit werden diese Vorgänge vom Bordcomputer ausgeführt. Der Aufwand ist halt der Bordcomputer, der u.a. diese Funktionalität kapselt. |
| | |
| | Nach oben #8 |
| Erfahrener Benutzer Registriert seit: 27.02.2006
Beiträge: 146
|
Sorry, dass ich das nächste gleich in einen neuen Beitrag setze, aber ich denke, die Trennung vereinfacht die Struktur (Meinetwegen streicht mir pauschal die Beiträge im Status Zur Aussage, warum die Trennung - Dazu muss man sich die zu bewertende Grammatik im Parser betrachten. Ich möchte jetzt hier weder die Grundsatzerläuterungen für Links- und rechts-Rekursiv arbeitende Grammatiken und deren Umsetzungen als Parser eingehen. Um es zu vereinfachen, für die Auswertung eines XML Tags wird der Inhalt vereinfacht wie folgt bewertet: ![]() Wichtig ist, dass an dieser Stelle der Eingansstream alias Datei byteweise analysiert wird. Für eine UTF-8 und UTF-16 sowie andere Codetables notwendige Anpassungen lasse ich der Einfachheit halber weg. Genauso die Attribute der Elemente, da sie durch wiederholende, eindeutig definierte Strings ohne weitere Auswertungsfunktionen realisiert sind. Gruß, Jumper, the II. Geändert von JumperII (15.02.2007 um 01:02 Uhr). |
| | |
| | Nach oben #9 |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
|
Also ich habs jetzt gelöst. Ist vielleicht ne Art Workaround. PHP-Code: Nun ja danke für die Hilfe auch wenn nicht alles kapiert hab. |
| | |
| | Nach oben #10 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
Versuch mal statt & einfach "&# 38;" zu nehmen. (ohne Leerzeichen bitte, aber das Forum wandelt das sonst in ein & um...) Das wird bei XHTML akzeptiert und könnte für reines XML vielleicht auch besser sein?! Quelle: http://www.arch.cam.ac.uk/comp/ac049/ (fast ganz unten)
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #11 |
| Erfahrener Benutzer Registriert seit: 30.10.2005
Beiträge: 279
|
Nun ja das ist recht kompliziert dort einzubauen, schließlich müsste ich die Input File ja vorher durchparsen und das & ersetzen, weil während des Parsens geht das ja nicht. Ich lass das besser so wie es jetzt is. |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| XML Parser mit PHP4 | Eyüp | PHP-Programmierung | 4 | 24.06.2007 16:20 |
| [Java] Parser Generierung mit JavaCC - Eine Einführung | pago | Tutorials | 0 | 14.04.2006 11:54 |
| MySQL 5.1 kommt in die Beta-Phase | Ben | Nachrichten | 1 | 02.03.2006 14:31 |
| PHP 4.4.1 veröffentlicht (Bugfix release) | Ben | Nachrichten | 0 | 01.11.2005 17:12 |