Ik hoop dat ik met het openen van dit topic niet teveel regeltjes overtreed. Mocht dat wel zo zijn, excuus. Ik kom zelf niet zoveel in P&W, dus heb niet zoveel kaas gegeten van de lokale mores
Ik heb overigens de search gebruikt en ook op de rest van het net gezocht, maar ik kan niks vinden wat hier verband mee kan houden. Maar dat kan natuurlijk ook te maken hebben met de grote hoeveelheid info over de combo PHP + XML die beschikbaar is.
Korte omschrijving van de situatie
Ik heb een PHP scriptje dat een XML file (afkomstig uit een Progress database, hier heb ik verder geen details over; ik krijg de files kant en klaar aangeleverd) moet parsen om er uiteindelijk SQL inserts van te maken. Meestal werkt het script prima, maar bij sommige XML-elementen gaat het mis: de parser geeft dan niet alle PCDATA uit een element door aan mijn pc_data_handler.
De werkwijze
Voor het parsen van de XML files gebruik ik de standaard PHP XML functies. Ik heb begrepen dat er meerdere parsers beschikbaar zijn, maar ik zal het met deze moeten doen, aangezien het script bij een externe provider moet draaien. Hieronder volgen de regels die de parser aanmaken (let op: dit gebeurt in een class!):
Het probleem doet zich uitsluitend voor bij het verkrijgen van PCDATA, dus ik zal hieronder alleen de code van de character data handler invoegen:
Het probleem
Wat gebeurt er nu? Wel, in 99,9% van de gevallen krijgt de character data handler de gegevens aangeleverd van de parser zoals ze ook letterlijk in de XML file staan. Heel soms, maar wel steeds bij dezelfde records, krijg ik echter maar een gedeelte van de data die in het element staan. Van de waarde "1234" krijg ik bijvoorbeeld alleen maar "34" of "123". Uiteraard vermoedde ik dat het moest liggen aan de XML, dus heb ik, bij wijze van test, een record in de XML file wat steeds problemen gaf ('record A'), omgewisseld met een record op een andere locatie binnen dezelfde file ('record B'). Na die omwisseling, geeft ineens 'record B' de problemen die eerst voorkwamen bij 'record A', terwijl 'record A' gewoon goed wordt geparst. Hieronder volgt een voorbeeldje van een record wat geparst moet worden:
Zoals gezegd, heb ik geen verband kunnen vinden tussen de XML data en de vermoedelijke fout in de parser. Iemand enig idee wat hier aan de hand is? Excuseer als het iets heel triviaals is, maar ik raak er echt geen wijs meer uit...
Korte omschrijving van de situatie
Ik heb een PHP scriptje dat een XML file (afkomstig uit een Progress database, hier heb ik verder geen details over; ik krijg de files kant en klaar aangeleverd) moet parsen om er uiteindelijk SQL inserts van te maken. Meestal werkt het script prima, maar bij sommige XML-elementen gaat het mis: de parser geeft dan niet alle PCDATA uit een element door aan mijn pc_data_handler.
De werkwijze
Voor het parsen van de XML files gebruik ik de standaard PHP XML functies. Ik heb begrepen dat er meerdere parsers beschikbaar zijn, maar ik zal het met deze moeten doen, aangezien het script bij een externe provider moet draaien. Hieronder volgen de regels die de parser aanmaken (let op: dit gebeurt in een class!):
PHP:
1
2
3
4
5
| //Create an XML parser $this->xml_parser = xml_parser_create(); xml_set_object($this->xml_parser, $this); xml_set_element_handler($this->xml_parser, "_xml_start_element_handler", "_xml_end_element_handler"); xml_set_character_data_handler($this->xml_parser, "_xml_character_data_handler"); |
Het probleem doet zich uitsluitend voor bij het verkrijgen van PCDATA, dus ik zal hieronder alleen de code van de character data handler invoegen:
PHP:
1
2
3
4
5
| function _xml_character_data_handler ($parser, $data) { if ($this->import_element) { $this->records[$this->num_records][$this->current_field] = mysql_escape_string($data); } } |
Het probleem
Wat gebeurt er nu? Wel, in 99,9% van de gevallen krijgt de character data handler de gegevens aangeleverd van de parser zoals ze ook letterlijk in de XML file staan. Heel soms, maar wel steeds bij dezelfde records, krijg ik echter maar een gedeelte van de data die in het element staan. Van de waarde "1234" krijg ik bijvoorbeeld alleen maar "34" of "123". Uiteraard vermoedde ik dat het moest liggen aan de XML, dus heb ik, bij wijze van test, een record in de XML file wat steeds problemen gaf ('record A'), omgewisseld met een record op een andere locatie binnen dezelfde file ('record B'). Na die omwisseling, geeft ineens 'record B' de problemen die eerst voorkwamen bij 'record A', terwijl 'record A' gewoon goed wordt geparst. Hieronder volgt een voorbeeldje van een record wat geparst moet worden:
XML:
1
2
3
4
5
6
| <Record> <id-postco>956</id-postco> <post-code>1234 AB</post-code> <straat>Stationsstraat</straat> <id-woonpl>10</id-woonpl> </Record> |
Zoals gezegd, heb ik geen verband kunnen vinden tussen de XML data en de vermoedelijke fout in de parser. Iemand enig idee wat hier aan de hand is? Excuseer als het iets heel triviaals is, maar ik raak er echt geen wijs meer uit...
This is the way the world ends. Not with a bang but a whimper. -T.S. Eliot