Du bist nicht angemeldet.

  • »scriptedSheep« ist der Autor dieses Themas

Beiträge: 799

Wohnort: Berlin

Beruf: Student, Freelancer

  • Private Nachricht senden

1

Mittwoch, 15. Juni 2011, 17:40

PHP XMLReader PCDATA invalid Char

Hallo Leute,

ich parse einen Feed mit dem XMLReader in PHP (der ist so toll schnell!) aber bekomme manchmal (ist auch lustiger weise immer beim selben) diese Error-Meldung:

Quellcode

1
2
 XMLReader::read(): http://myfeedurl:22180: parser error : PCDATA invalid Char value 16
 
.
Ich habe das ganze mal mit von der W3C validieren lassen, heraus kam folgendes: http://validator.w3.org/check?uri=http%3…=Inline&group=0

Könnt ihr mir da vielleicht irgendwie weiterhelfen?

2

Mittwoch, 15. Juni 2011, 17:55

kannst ja mal schauen, ob HTML Tidy das automatisch beheben kann. Im W3C Validator gibts ne Checkbox, dass er HTML-Tidy Ausgabe macht, die kannst Du dann unten mal Copy&Paste durch Dein Skript jagen und schauen, ob das ausreicht. Wenn ja, dann installier Dir einfach HTML Tidy auf dem Server. Gibs vielleicht schon fertig für PHP...
C++

  • »scriptedSheep« ist der Autor dieses Themas

Beiträge: 799

Wohnort: Berlin

Beruf: Student, Freelancer

  • Private Nachricht senden

3

Mittwoch, 15. Juni 2011, 17:58

Kann ich damit auch Streams parsen? Ich habe nämlich extra den XMLReader genommen um die Daten direkt zu parsen wenn sie reinkommen, nicht erst wenn sie komplett runtergeladen wurden. Aber danke für den Tipp schon mal!

4

Mittwoch, 15. Juni 2011, 18:08

Gute Frage..ich denk fast eher nicht.

Und wenn Du ein SAX Parser nimmst? Die sind ja ohnehin für Streaming gedacht und Du bist mehr oder minder selber für Fehler zuständig. Den konkreten Fehler könntest Du damit wahrscheinlich einfach ignorieren bzw. abfangen.
C++

  • »scriptedSheep« ist der Autor dieses Themas

Beiträge: 799

Wohnort: Berlin

Beruf: Student, Freelancer

  • Private Nachricht senden

5

Mittwoch, 15. Juni 2011, 18:15

Ich probiere es mal mit der

Quellcode

1
$reader->readInnerXML()
-Funktion vom XMLReader, dann muss ich zwar noch temporär einen zweiten Reader einsetzen, aber egal. Muss ich noch irgendwas in der .ini aktivieren? Bekomme folgende Fehlermeldung:

Quellcode

1
 Call to undefined function tidy_repair_string() 

6

Mittwoch, 15. Juni 2011, 18:17

Sorry, keine Ahnung. Ich mach kein PHP. Ich empfehle Python für Webanwendungen. In Python würde ich Beautiful Soup empfehlen. Der frisst alles :)
C++

7

Mittwoch, 15. Juni 2011, 20:08

ich parse einen Feed mit dem XMLReader in PHP (der ist so toll schnell!) aber bekomme manchmal (ist auch lustiger weise immer beim selben) diese Error-Meldung:

Quellcode

1
 XMLReader::read(): http://myfeedurl:22180: parser error : PCDATA invalid Char value 16 
.
Ich habe das ganze mal mit von der W3C validieren lassen, heraus kam folgendes: http://validator.w3.org/check?uri=http%3…=Inline&group=0
PHP und W3C bemängeln einen Control Character, der da nicht sein sollte – warum beseitigst Du ihn dann nicht einfach?

Carsten

8

Mittwoch, 15. Juni 2011, 20:12

Kann ich damit auch Streams parsen?
Du kannst mit PHP quasi beliebige Stream-Wrapper erzeugen (z.B. einen, der unerwünschte Control Characters rausschmeißt) und diese an XMLReader::open() übergeben.

Carsten

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Nasir« (15. Juni 2011, 20:19)


9

Mittwoch, 15. Juni 2011, 20:19

Bekomme folgende Fehlermeldung:

Quellcode

1
 Call to undefined function tidy_repair_string() 
Zum einen ist die Tidy-Extension nur verfügbar, wenn PHP mit dem Switch

Quellcode

1
--with-tidy
kompiliert wurde oder eine entsprechende Library separat kompiliert und im Code geladen wurde.

Daneben stellt sich aber die Frage, was das für eine Funktion sein soll; auf http://de3.php.net/tidy sucht man jedenfalls vergeblich nach ihr. (Ja, ich weiß, es gibt auch undokumentierte Funktionen, aber die Tidy-Extension ist dafür eigentlich zu alt.)

Carsten

  • »scriptedSheep« ist der Autor dieses Themas

Beiträge: 799

Wohnort: Berlin

Beruf: Student, Freelancer

  • Private Nachricht senden

10

Mittwoch, 15. Juni 2011, 20:20

ich versteh was du meinst, weiß aber grade nicht so wirklich wie man so einen Wrapper umsetzten könnte. Kannst du mir da vielleicht kurz helfen? Das wäre echt nett!

11

Mittwoch, 15. Juni 2011, 22:45

ich versteh was du meinst, weiß aber grade nicht so wirklich wie man so einen Wrapper umsetzten könnte. Kannst du mir da vielleicht kurz helfen? Das wäre echt nett!
Die Dokus dazu:
  • http://de2.php.net/manual/de/function.stream-wrapper-register.php
  • http://de2.php.net/manual/de/stream.streamwrapper.example-1.php
  • http://de2.php.net/manual/de/class.streamwrapper.php
Ich schätze, es gibt auch vollständige Beispiele für fertige Stream-Wrapper im Web. Die bieten natürlich andere Funktionalitäten, aber das auf Deine Zwecke abzuändern, dürfte trivial sein.

Carsten

  • »scriptedSheep« ist der Autor dieses Themas

Beiträge: 799

Wohnort: Berlin

Beruf: Student, Freelancer

  • Private Nachricht senden

12

Mittwoch, 15. Juni 2011, 23:39

Reicht es dann, wenn ich in meiner Stream-Wrapper-Klasse einfach

Quellcode

1
 stream_open()
und

Quellcode

1
 stream_read() 
implementiere und dann da tidy drüber jage?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »scriptedSheep« (16. Juni 2011, 10:52)


  • »scriptedSheep« ist der Autor dieses Themas

Beiträge: 799

Wohnort: Berlin

Beruf: Student, Freelancer

  • Private Nachricht senden

13

Donnerstag, 16. Juni 2011, 11:00

Das habe ich als Sourcecode aus dem Validator, was ist denn da dran jetzt so böse???

Quellcode

1
 Black : Split to 8-small bubbles 

  • »scriptedSheep« ist der Autor dieses Themas

Beiträge: 799

Wohnort: Berlin

Beruf: Student, Freelancer

  • Private Nachricht senden

14

Donnerstag, 16. Juni 2011, 13:28

Falls es noch mal jemanden interessieren sollte der von Google hergeschickt wird oder so, das ganze habe ich nun (recht einfach....) wie folgt gelöst:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public function stripInvalidXml($value){
	    $ret = "";
	    $current;
	    if (empty($value)) 
	    {
	        return $ret;
	    }
	 
	    $length = strlen($value);
	    for ($i=0; $i < $length; $i++)
	    {
	        $current = ord($value{$i});
	        if (($current == 0x9) ||
	            ($current == 0xA) ||
	            ($current == 0xD) ||
	            (($current >= 0x20) && ($current <= 0xD7FF)) ||
	            (($current >= 0xE000) && ($current <= 0xFFFD)) ||
	            (($current >= 0x10000) && ($current <= 0x10FFFF)))
	        {
	            $ret .= chr($current);
	        }
	        else
	        {
	            $ret .= " ";
	        }
	    }
	    return $ret;
	}

$reader->XML($this->stripInvalidXml(file_get_contents($this->link)));




Dank für die Hilfe an alle!

  • »scriptedSheep« ist der Autor dieses Themas

Beiträge: 799

Wohnort: Berlin

Beruf: Student, Freelancer

  • Private Nachricht senden

15

Freitag, 24. Juni 2011, 10:40

Mhm, vielleicht kannst du mir noch mal kurz helfen was ich in der

Quellcode

1
 stream_read() 
-Methode im Wrapper implementieren muss?

Ähnliche Themen

Social Bookmarks