[PHP] XML bestand lezen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • marcop23
  • Registratie: December 2009
  • Laatst online: 20-09 22:07
Ik wil graag een groot XML bestand lezen met PHP, om inhoud daarvan in een database te zetten. Hiervoor gebruik ik PHP met SimpleXML. Bij het uitlezen van het XML-bestand krijg ik echter vele errors, volgens mij doordat er ''vreemde'' tekens in staan, zoals een vraagteken. Ik dacht er aan om het in base64 te zetten, maar daardoor moet ik eerst het bestand openen, wat al fout gaat. Het XML bestand krijg ik, en kan ik niet wijzigen zonder daarvoor bijvoorbeeld PHP te gebruiken.

Met de code
PHP:
1
2
3
<?php
$xml = simplexml_load_file("user.xml");
?>

krijg ik deze errors:
code:
1
2
3
4
5
6
7
Warning: simplexml_load_file() [function.simplexml-load-file]: user.xml:212107: parser error : EntityRef: expecting ';' in C:\xampp\htdocs\boinc\userdb.php on line 7
Warning: simplexml_load_file() [function.simplexml-load-file]: <user_url>http://forums.overclockers.co.uk/forumdisplay.php?s=&forumid= in C:\xampp\htdocs\boinc\userdb.php on line 7
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in C:\xampp\htdocs\boinc\userdb.php on line 7
Warning: simplexml_load_file() [function.simplexml-load-file]: user.xml:310434: parser error : EntityRef: expecting ';' in C:\xampp\htdocs\boinc\userdb.php on line 7
Warning: simplexml_load_file() [function.simplexml-load-file]: <user_url>http://stats.free-dc.org/stats.php?page=user&proj=qmc&name=72 in C:\xampp\htdocs\boinc\userdb.php on line 7
Warning: simplexml_load_file() [function.simplexml-load-file]: ^ in C:\xampp\htdocs\boinc\userdb.php on line 7
... enzovoort ...

Ik gebruik een standaard installatie van xampp op Windows. Ik ben nog maar net begonnen met PHP, en heb dus nog niet veel ervaring.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Euh, zonder (een deel van) de relevante XML is hier weinig over te zeggen behalve wat de foutmeldingen al aangeven; waarschijnlijk is je XML gaar.

Sowieso, een & dient als &amp; escaped te worden.
marcop23 schreef op dinsdag 18 januari 2011 @ 17:33:
Ik dacht er aan om het in base64 te zetten
Niet doen en niet aan beginnen. Gewoon correct escapen; alle andere oplossingen zijn symptoombestrijding en maken je XML er niet leesbaarder/beter op en daarbij kom je straks weer op allerlei random plaatsen zaken aan 't base64_decoden.

[ Voor 77% gewijzigd door RobIII op 18-01-2011 17:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • marcop23
  • Registratie: December 2009
  • Laatst online: 20-09 22:07
Ik probeer het BOINC XML file 'user.xml' te parsen. Dit wil ik graag omdat ik er zelf andere dingen mee wil gaan doen dan de bestaande stats sites. Met het eerste deel van de XML (80 users) kan PHP wel uit de voeten.

*snip*

[ Voor 9% gewijzigd door RobIII op 18-01-2011 17:42 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Post a.u.b. even relevante(!) XML en daar een representatief stukje van. Linken naar een 205MB grote XML file is niet de bedoeling :X

[edit]
Overigens; dat XML bestand is inderdaad ongeldig; open dat bestand maar eens in (bijv.) Internet Explorer (en geef 'm effe de tijd :X ) of een willekeurige andere XML editor (XML Notepad ofzo)

[edit2]
En 't is klaarblijkelijk een bekend probleem. Oh, wacht, dat is wel BOINC maar een ander project ofzo. Ik weet niet wat ze voor XML parser gebruiken daar dan, maar dat is niet veel soeps :X
Het gaat o.a. mis op:
XML:
1
<user_url>http://stats.free-dc.org/stats.php?page=user&proj=qmc&name=72074</user_url>

Wat als volgt moet zijn:
XML:
1
<user_url>http://stats.free-dc.org/stats.php?page=user&amp;proj=qmc&amp;name=72074</user_url>

Precies wat de foutmelding je ook al vertelt. En die fout komt meer dan eens voor...
Daar moet je een heel eind mee komen; normaliter doen we niet zoveel moeite ;)

[ Voor 104% gewijzigd door RobIII op 18-01-2011 18:03 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • elnaeth
  • Registratie: Januari 2009
  • Laatst online: 09-09 17:47
Ik zou inderdaad een deel van je XML hier posten; hier kunnen we weinig mee ;)

Acties:
  • 0 Henk 'm!

  • marcop23
  • Registratie: December 2009
  • Laatst online: 20-09 22:07
elnaeth schreef op dinsdag 18 januari 2011 @ 17:43:
Ik zou inderdaad een deel van je XML hier posten; hier kunnen we weinig mee ;)
De fouten zijn verdeeld over die hele file, dus een relevant deel kan ik hier niet posten. Ik heb ook geen supernieuwe computers, maar om die file te openen heb ik in ieder geval een Linux machine nodig. Aan de processorkracht ligt het niet, die komt niet hoog bij het openen. Ik kan hem in ieder geval niet openen op een Windows 7 PC met een Celeron D 320 en 2 GB geheugen, maar wel op een pc met Ubuntu en een Athlon 4400+ met 1GB geheugen.

Kan ik hier overigens iets aan doen, of moet ik gewoon een bugreport doen en hopen dat ze het oplossen?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
marcop23 schreef op dinsdag 18 januari 2011 @ 18:35:
De fouten zijn verdeeld over die hele file, dus een relevant deel kan ik hier niet posten.
Tuurlijk wel. Zie mijn vorige post waar ik precies de vinger op de zere plek weet te leggen; als je gewoon een stukje eruit had gepakt waar de error naar verwijst had je ook een relevant deel gehad.
marcop23 schreef op dinsdag 18 januari 2011 @ 18:35:
Ik heb ook geen supernieuwe computers, maar om die file te openen heb ik in ieder geval een Linux machine nodig.
Onzin; het is alleen wel zo als je de file (bijvoorbeeld) opent in IE dat je "even" moet wachten (en bij zo'n dikke file kan 't makkelijk een kwartier duren op een trage PC). Pak je een beetje XML editor er bij (zie vorige post, maar er zijn er legio) dan pikt 'ie meteen de fout er uit. En het kan inderdaad dus zo zijn dat je PC even aan 't swappen moet ofzo bij weinig geheugen, maar een beetje tool moet die file dus wel kunnen openen.
marcop23 schreef op dinsdag 18 januari 2011 @ 18:35:
Aan de processorkracht ligt het niet, die komt niet hoog bij het openen. Ik kan hem in ieder geval niet openen op een Windows 7 PC met een Celeron D 320 en 2 GB geheugen, maar wel op een pc met Ubuntu en een Athlon 4400+ met 1GB geheugen.
Het verschil zit 'm in de software die je gebruikt om de XML te openen. De een zal dat efficienter doen dan de ander (en de een zal een DOM opbouwen (=traag/trager en geheugenintensiever), de ander (zeg, een 'nano' of 'notepad' bijvoorbeeld) zal 't gewoon als tekst weergeven.
marcop23 schreef op dinsdag 18 januari 2011 @ 18:35:
Kan ik hier overigens iets aan doen, of moet ik gewoon een bugreport doen en hopen dat ze het oplossen?
Ik zou sowieso een bugreport indienen want alle workarounds die er zijn zijn just that: workarounds. Het probleem zit in de XML file en dat zal gefixed moeten worden.

Wat je, tijdelijk als workaround dus, zou kunnen doen is de ampersands die ge-escaped moeten worden correct escapen door eers met een fopen oid de file te openen en dan "op goed geluk" de meuk proberen te replacen maar dat wordt al heel snel heel gevaarlijk als je niet de juiste context gebruikt en is dus niet echt wenselijk.

[ Voor 5% gewijzigd door RobIII op 18-01-2011 19:14 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
php.net:
Tip
Use libxml_use_internal_errors() to suppress all XML errors, and libxml_get_errors() to iterate over them afterwards.

Kijk ook naar de options parameter:
http://www.php.net/manual...n.simplexml-load-file.php
Pagina: 1