Toon posts:

[XML / PHP] Probleem met & in XML file

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb ff een simpel parsertje gemaakt voor de XML file van de FOK! Remote Tracker (altijd leuk toch?), die om de 5 minuten remote.xml naar me eigen servertje kopieert. Dat werkte allemaal leuk en aardig, maar nu staat er opeens een & in een Fok! Remote Tracker (nieuw nieuws) item. Daar begint m'n parser over te mekkeren, is hier iets aan te doen?
PHP:
1
<?// Kijk of bestand overgehaald moet worden$tijd    = file('tijd.txt');$nu      = time();$wanneer = (5 * 60); // Om de hoe veel seconcden herladen? 5x60seconden = 5 minuten!if(($tijd[0] + $wanneer) <= $nu){    $xml  = file('http://www.athena.fokzine.net/~danny/remote.xml');    $file = fopen('remote.xml', 'w');    foreach($xml as $line)    {        fputs($file, $line);    }    fclose($file);    $uurfile = fopen('tijd.txt','w');    fputs($uurfile, $nu);    fclose($uurfile);    $lfile = fopen('laatse.txt','w');    fputs($lfile, date('H:i'));    fclose($lfile);}// Start parsing$xmlSource="remote.xml";$id="";$titel="";$time="";$timestamp="";$reacties="";$currentElement="";$nieuws=array();function startElement($parser,$name,$attr){            $GLOBALS['currentElement']=$name;        }function endElement($parser,$name){    $elements=array('id','titel','time','timestamp','reacties');      if(strcmp($name,"nieuws")==0){            foreach($elements as $element){                $temp[$element]=$GLOBALS[$element];                                        }                $GLOBALS['nieuws'][]=$temp;                       $GLOBALS['id']="";            $GLOBALS['titel']="";            $GLOBALS['time']="";            $GLOBALS['timestamp']="";                        $GLOBALS['reacties']="";      }}function characterData($parser, $data) {        $elements = array (             'id', 'titel', 'reacties',            'time', 'timestamp'        );        foreach ($elements as $element) {            if ($GLOBALS["currentElement"] == $element) {                $GLOBALS[$element] .= $data;            }        }    }function parseFile(){    global $xmlSource,$nieuws;        $xml_parser=xml_parser_create();        xml_set_element_handler($xml_parser,"startElement","endElement");    xml_set_character_data_handler($xml_parser,"characterData");        xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,false);       if(!($fp=fopen($xmlSource,"r"))){      die("Cannot open  $xmlSource  ");   }   while(($data=fread($fp,4096))){      if(!xml_parse($xml_parser,$data,feof($fp))){         die(sprintf("XML error at line %d column %d ",                       xml_get_current_line_number($xml_parser),                       xml_get_current_column_number($xml_parser)));      }   }          xml_parser_free($xml_parser);          return $nieuws;    }$result=parseFile();$result = array_slice($result,1,5);foreach($result as $arr){echo("<a href=\"http://frontpage.fok.nl/news.fok?id=$arr[id]\" class=\"noline\" target=\"_blank\">$arr[titel]</a><br>");}?>

Zoals je mischien ziet heb ik het een klein beetje van Zend.com/nogiets gekopieerd >:). Het stukje XML in kwestie zag er zo uit:
code:
1
2
3
4
5
6
7
    <nieuws>
        <id>19926</id>
        <titel>Gedeelte verdieping V&D stort in</titel>
        <time>27-06-2002 10:58</time>
        <timestamp>1025168326</timestamp>
        <reacties>28</reacties>
    </nieuws>

  • disjfa
  • Registratie: April 2001
  • Laatst online: 12-05 15:11

disjfa

be

dit lijkt wel een vraag die ik net wou posten :)

disjfa - disj·fa (meneer)
disjfa.nl


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Helaas worden veel van dergelijke trackers opgebouwd door gewoon strings weg te schrijven naar de output. Hierdoor is er geen enkele garantie dat de output well-formed is. Hier zie je het resultaat: ze hebben er niet aan gedacht dat je & als & moet schrijven.

Dit kan jij niet oplossen, want de XML is simpelweg niet well-formed. De 'aanbieder' van de XML moet dit oplossen.

De beste manier om dit op te lossen is door XML niet meer op te bouwen door strings uit te spugen, maar door een DOM op te bouwen en deze te serializeren. Dit kan performance gevolgen hebben en daarom is het nog beter om SAX events af te vuren naar een XML pretty-printer die gebaseerd is op een SAX ContentHandler.

Overigens hebben ze dit & probleem in het verleden ook hier op GoT gehad... Hier is het volgens mij gewoon opgelost daar er bij het outputten rekening mee te houden... Dit gaat goed totdat ze ontdekken dat ze nog iets vergeten zijn....

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


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:08
Op donderdag 27 juni 2002 15:50 schreef mbravenboer het volgende:
Overigens hebben ze dit & probleem in het verleden ook hier op GoT gehad... Hier is het volgens mij gewoon opgelost daar er bij het outputten rekening mee te houden... Dit gaat goed totdat ze ontdekken dat ze nog iets vergeten zijn....
Wat gelijk een argument is om iets complex als een XML parser/validator/generator nooit zelf te schrijven, tenzij je van plan bent om alle functionaliteit 100% correct te implementeren.

Hou er echter rekening mee dat dit een ontzettend groot karwei is, wat de nodige ervaring met het ontwerpen van dit soort applicaties vereist.

Ik kan je dus aanraden om gewoon een standaard XML library te gebruiken, dan weet je zeker dat alles goed gaat (en zo niet, dan is 't jou probleem niet). Blijft het feit dat in dit geval een standaard library de foute XML invoer ook zal afkeuren.

Een mogelijke work-around: zelf even (met een regexp oid) de ampersands eruit filteren.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Soultaker: Een mogelijke work-around: zelf even (met een regexp oid) de ampersands eruit filteren.
Totdat je tot de ontdekking komt dat ze iets anders wel tot een entiteit herschrijven ;) . ( < bijvoorbeeld)

Ik denk dat je het het beste even aan kunt kaarten op Fok zodat ze het daar bij de bron op kunnen lossen.

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


Verwijderd

mbravenboer schreef op 27 June 2002 @ 15:50:
ze hebben er niet aan gedacht dat je & als &amp; moet schrijven.
Dan is het probleem er nog! Aangezien in de nieuwe 'tag' ook een &-teken zit.

Weet iemand hoe dit op te lossen is, want ik ben er ook mee bezig en kom er ook niet uit. Heb bijv. ook problemen met é en ë.

Verwijderd

Kan iemand mij hiermee helpen???

Verwijderd

ikke niet, maar lees de quickstart effe door, liever niet kicken binnen 24 uur, dus al helemaal nie na een uurtje!

  • LEiPiE
  • Registratie: Juni 2001
  • Laatst online: 24-08 10:10

LEiPiE

... (ing. van weinig woorden)

Verwijderd schreef op 07 February 2003 @ 14:22:
[...]

Dan is het probleem er nog! Aangezien in de nieuwe 'tag' ook een &-teken zit.
Dat is *geen* probleem :)
de & maakt er juist een tag van... &amp; is de tag voor een & (_amp_ersand) (net zoals je bij reguliere expressies een dubbele slash moet gebruiken om een enkele te krijgen :))
En zo'n tag (een entity is 't officieel) moet met een & beginnen.
Weet iemand hoe dit op te lossen is, want ik ben er ook mee bezig en kom er ook niet uit. Heb bijv. ook problemen met é en ë.
Dat is lastiger, maar niet onoverkomelijk:
stel een handige text-encoding in:
code:
1
&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;

Bijvoorbeeld voor de standaard Windows encoding, als je dan in je file een ö, ë, è of whatever je kunt maken intikt, dan behoort dat overal goed te gaan :)

Voorbeeldje van die encoding:
enorme link
Lyrics van de eerste track zijn in 't Italiaans, dus genoeg rare tekens :)
Nog raardere tekens: track 9 bevat stukken Russisch.

Als je 't niet gelooft dat 't klopt dan moet je de file maar ff downloaden :)
Als het goed is moet je die file zo kunnen opslaan en anders ff save target doen op http://zielknijper.student.utwente.nl/music/xml/
(staat verder nog niks, is ook niet de bedoeling... ben wat mp3 albums van zo'n uitgebreide beschrijving aan het voorzien (de albums die ik gedaan heb, heb ik overigens ook echt hoor))

De XML file ziet overigens uiteraard erg anders uit: wordt opgemaakt met een XSLT en met CSS :)
(was de eerste keer dat ik me eens in XSL heb verdiept en 't werkt lekker! vooral het genereren van bijvoorbeeld inhoudsopgaves bevalt me erg goed).

Papa x3, PHP-progger, Citrofiel, import-Tukker, muziekliefhebber


  • zoepercavia
  • Registratie: September 2001
  • Laatst online: 26-12-2025
De beste manier om dit op te lossen is door XML niet meer op te bouwen door strings uit te spugen, maar door een DOM op te bouwen en deze te serializeren
.
op m'n eigen site gebruik ik de volgende code:
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
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;xsl:stylesheet xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;
                version=&quot;1.0&quot;&gt;
 
    &lt;xsl:output method=&quot;xml&quot;/&gt;

    &lt;xsl:template match=&quot;/&quot;&gt;
        &lt;xsl:apply-templates/&gt;
    &lt;/xsl:template&gt;

    &lt;xsl:template match=&quot;*&quot;&gt;
        &lt;xsl:element name=&quot;{name(.)}&quot;&gt;
            &lt;xsl:for-each select=&quot;@*&quot;&gt;
                &lt;xsl:attribute name=&quot;{name(.)}&quot;&gt;
                    &lt;xsl:value-of select=&quot;.&quot;/&gt;
                &lt;/xsl:attribute&gt;
            &lt;/xsl:for-each&gt;
            &lt;xsl:apply-templates/&gt;
        &lt;/xsl:element&gt;
    &lt;/xsl:template&gt;

    &lt;xsl:template match=&quot;text()&quot;&gt;
    &lt;xsl:value-of select=&quot;.&quot;/&gt;
    &lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;


deze code kan je gebruiken om op basis van xml een string te genereren die er hetzelfde uitziet als de oorspronkelijke XML. Is dit een beetje net? En hoe veel performance verlies krijg je erdoor?
Op mijn eigen site worden de updatetrackers alleen ververst bij verandering van content, dus lijkt me performance ook geen probleem. Hoe zit dat bij Fok en Tweakers/GOT?

Overigens kan het in .Net gewoon met .OuterXML (property van XmlElement)

[ Voor 16% gewijzigd door zoepercavia op 08-02-2003 01:36 . Reden: gek van c# :) ]

Panacea.NL als je geinteresserd bent in IT en Geneeskunde!


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
zoepercavia: deze code kan je gebruiken om op basis van xml een string te genereren die er hetzelfde uitziet als de oorspronkelijke XML. Is dit een beetje net?
Ik begrijp eigenlijk niet waarom je deze transformatie uberhaupt nodig hebt. Die transformatie die je toepast is volgens mij een identiteits transformatie: er komt hetzelfde uit als er in gaat. Op zich is zo'n identity transformatie best mooi (en af en toe ook nuttig), maar waarom heb je dan uberhaupt XSLT nodig?

Vermoedelijk serializeert de XSLT processor of die jij gebruikt (of de methode die jij gebruikt om de XSLT processor aan te roepen) standaard (of makkelijk) het resultaat naar tekst, maar accepteert het een DOM. Je gebruikt de XSLT dan dus in feite alleen maar voor het serializeren en dat kan ik eerlijk gezegd toch niet echt netjes noemen ;) . Is er geen andere, efficientere, methode om je DOM te serializeren?
zoepercavia: En hoe veel performance verlies krijg je erdoor?
Aardig wat: serializatie van een DOM naar tekst kan vrij efficient. Wat je hier doet is in feite een XSLT processor aanzwengelen, er een transformatie in toepassen die helemaal niets doet en daarna de XSLT processor de resulterende DOM laten serializeren.
james_bond_007: Dan is het probleem er nog! Aangezien in de nieuwe 'tag' ook een &-teken zit.
Dat heet een referentie naar een entiteit ;) . Kort gezegd dus een entiteit. Over het algemeen noemen we zo'n < foo > constructie een tag. Verder is het al uitgelegd door leipie waarom het probleem dan inderdaad is opgelost :) .

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

Pagina: 1