[php] Aanpassing XML parser voor turbotracker

Pagina: 1
Acties:

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Omdat de turbotracker van Tweakers.net geen geldige XML terug geeft moet ik mijn PHP code aanpassen zodat de XML toch goed wordt geparsed.

Op dit moment gebruik ik deze code om de XML te parsen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
$xml_file = "http://www.tweakers.net/turbotracker.dsp";

$xml_parser = xml_parser_create($type);
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, $type);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");

$fp = fopen($xml_file, "r");

if ($fp == False) {
    die("Could not open $xml_file for parsing!\n");
}

while ($data = fgets($fp, 4096)) {
    xml_parse($xml_parser, $data, feof($fp));
}

xml_parser_free($xml_parser);
?>

Wat moet ik precies aanpassen, zodat de 'speciale' tekens waardoor de XML parser van PHP over z'n nek gaat, toch goed worden geparsed?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Het is natuurlijk erg omslachtig, maar je kunt turbotracker.xml inlezen, de & door & vervangen, dat opslaan op je eigen server, en door de xml-parser laten inlezen.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op woensdag 29 augustus 2001 18:19 schreef marcusk het volgende:
Het is natuurlijk erg omslachtig, maar je kunt turbotracker.xml inlezen, de & door & vervangen, dat opslaan op je eigen server, en door de xml-parser laten inlezen.
Da's idd een optie, maar ik denk dat deze onvolkomenhied zeer binnenkort uit de XML wordt gehaald (dus dat de turbotracker een echte XML is). Misschien is er een makkelijkere oplossing, zodat ik het snel weer terug kan zetten.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Ik zie nu dat je zelf het bestand inleest, en dat aan de parser doorgeeft. Dan kun je zoiets doen:
code:
1
2
3
4
5
while ($data = fgets($fp, 4096)) 
{
    $data = str_replace("&", "&amp;", $data);
    xml_parse($xml_parser, $data, feof($fp));
}

nu maar hopen dat de & consequent niet in & omgezet wordt door de turbotracker ;) (anders krijg je &amp;)

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Dan krijg ik dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
ID: 18152
TITEL: LiteOn LTR-24102B CD-R/RW review
EDITOR: Guus Besuijen
CATEGORIE: Hardware
BRON: HardwareZone.com
LINK: http://www.hardwarezone.com/php/pcodes/reviews.php3?_di=2
LINK: &
LINK: amp;_c=10
LINK: &
LINK: amp;_aid=2001-08-20+19%3A33%3A58
TIJD: 28-08-2001 23:32
TIMESTAMP: 999034348
REACTIES: 18

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Er zit blijkbaar een fout in de xml-parser van php.
Je zou het kunnen oplossen door de chardata tussen link-elementen op te tellen binnen een nieuwsposting-element. Zoiets dus:
code:
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
linkdata = "";
link_element_open = false;

function startElement(int parser, string name, array attribs)
{
  if (name == "NIEUWSPOSTING")
    linkdata = "";

  else if (name == "LINK")
    link_element_open = true;
}

function endElement(int parser, string name)
{
  if (name == "LINK")
    link_element_open = false;

  else if (name == "NIEUWSPOSTING")
  {
    echo linkdata; // de complete link zit nu in linkdata
  }
}

function characterData(int parser, string data)
{
  if (link_element_open)
    linkdata .= data;
}

edit:
oeps :) ik ben alle $-en voor de variabel-namen vergeten :)

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 29-11 15:21
Je kan het ook proberen met DOMXML, want ook dat kan PHP :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11 01:34
Kijk nog even hier: [topic=215472/1]

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik heb mijn code al even aangepast, zodat het perfect werkt:
Bij de functie characterData tel in de data op in een string. En pas bij endElement weet ik dat dit de uiteindelijke inhoud van de tag is.

"The shell stopped unexpectedly and Explorer.exe was restarted."

Pagina: 1