Avatar billede donslund Nybegynder
18. juni 2009 - 10:26 Der er 16 kommentarer og
1 løsning

XML output validerer ikke korrekt

Jeg har et PHP dokument der skal udskrive noget XML. Jeg får dog en fejl når jeg validerer XML'en.

XML parsing error: <unknown>:1:294: not well-formed (invalid token)

18-06-2009 17:00]]></title><link>http://www.m

Fejlen skulle ligge ved det første t i http. Jeg forstår det ikke. Det er ikke første gang der står http i XML'en.
Avatar billede arne_v Ekspert
18. juni 2009 - 10:32 #1
Maa vi se lidt mere af XML'en ?

Gerne en komplet XML snippet som illusterer problemet.
Avatar billede donslund Nybegynder
18. juni 2009 - 10:33 #2
Komplet xml.

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>mctraef.dk</title><link>http://www.mctraef.dk</link><description>MCtræf i hele Danmark</description><item><title><![CDATA[MC træf, Færch Torvet 18-06-2009 17:00]]></title><link>http://www.mctraef.dk/index.php?inc=traef&id=15"></link><description></description></item><item><title><![CDATA[Højeruplund Traktørsted 21-06-2009 10:30]]></title><link>http://www.mctraef.dk/index.php?inc=traef&id=23"></link><description></description></item><item><title><![CDATA[Niverød MC 21-06-2009 11:00]]></title><link>http://www.mctraef.dk/index.php?inc=traef&id=32"></link><description></description></item><item><title><![CDATA[Torvet i Hillerød 21-06-2009 11:00]]></title><link>http://www.mctraef.dk/index.php?inc=traef&id=33"></link><description></description></item><item><title><![CDATA[Fælleskørsel fra BikX 21-06-2009 12:00]]></title><link>http://www.mctraef.dk/index.php?inc=traef&id=34"></link><description></description></item></channel></rss>

Selvom det nok er ret uoverskueligt :-)
Avatar billede donslund Nybegynder
18. juni 2009 - 10:34 #3
Ekspertens syntaksfavning hjalp mig. Det er et " for meget efter 15.
Avatar billede donslund Nybegynder
18. juni 2009 - 10:37 #4
Og dog. Stadig samme fejl. XML se nu således ud:

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>mctraef.dk</title><link>http://www.mctraef.dk</link><description>MCtræf i hele Danmark</description><item><title><![CDATA[MC træf, Færch Torvet 18-06-2009 17:00]]></title><link>http://www.mctraef.dk/index.php?inc=traef&id=15</link><description></description></item><item><title><![CDATA[Højeruplund Traktørsted 21-06-2009 10:30]]></title><link>http://www.mctraef.dk/index.php?inc=traef&id=23</link><description></description></item><item><title><![CDATA[Niverød MC 21-06-2009 11:00]]></title><link>http://www.mctraef.dk/index.php?inc=traef&id=32</link><description></description></item><item><title><![CDATA[Torvet i Hillerød 21-06-2009 11:00]]></title><link>http://www.mctraef.dk/index.php?inc=traef&id=33</link><description></description></item><item><title><![CDATA[Fælleskørsel fra BikX 21-06-2009 12:00]]></title><link>http://www.mctraef.dk/index.php?inc=traef&id=34</link><description></description></item></channel></rss>
Avatar billede repox Seniormester
18. juni 2009 - 11:07 #5
Dit XML er ikke synderligt pænt... Men det er jo ikke det det handler om. Du har to fejl, lige nu der kunne give fejl:

Tomme elementer skal altid afslutte sig selv. Dit description element skal skrives som <description /> når du ikke har noget indhold i.

& tegn skal skrives som &amp;
Derfor vil dine link tags give fejl, som de ser ud nu.
Du skal skrive:
http://www.mctraef.dk/index.php&amp;inc=traef&amp;id=15
Avatar billede donslund Nybegynder
18. juni 2009 - 11:11 #6
Ja se, det lettede :-)

Hvad skal jeg gøre for at mit rss blive pænt?
Jeg hjar fulgt w3schools' guide
Avatar billede repox Seniormester
18. juni 2009 - 11:11 #7
Jeg forhastede mig med linket, jeg fik også oversat ? til et &, hvilket ikke var meningen:
http://www.mctraef.dk/index.php?inc=traef&amp;id=15
Avatar billede repox Seniormester
18. juni 2009 - 11:11 #8
Hvordan laver du XML'en?
Avatar billede donslund Nybegynder
18. juni 2009 - 11:15 #9
Via noget php-kode med udtræk fra en MySQL.
Avatar billede repox Seniormester
18. juni 2009 - 11:17 #10
...
ja, men hvordan?
Bruger du DOM, SimpleXML eller skriver du skidtet manuelt?
Avatar billede Slettet bruger
18. juni 2009 - 11:19 #11
At escape alle links virkede for mig:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>mctraef.dk</title>
        <link>http://www.mctraef.dk</link>
        <description>MCtræf i hele Danmark</description>
        <item>
            <title><![CDATA[MC træf, Færch Torvet 18-06-2009 17:00]]></title>
            <link><![CDATA[http://www.mctraef.dk/index.php?inc=traef&id=15]]></link>
            <description></description>
        </item>
        <item>
            <title><![CDATA[Højeruplund Traktørsted 21-06-2009 10:30]]></title>
            <link><![CDATA[http://www.mctraef.dk/index.php?inc=traef&id=23]]></link>
            <description></description>
        </item>
        <item>
            <title><![CDATA[Niverød MC 21-06-2009 11:00]]></title>
            <link><![CDATA[http://www.mctraef.dk/index.php?inc=traef&id=32]]></link>
            <description></description>
        </item>
        <item>
            <title><![CDATA[Torvet i Hillerød 21-06-2009 11:00]]></title>
            <link><![CDATA[http://www.mctraef.dk/index.php?inc=traef&id=33]]></link>
            <description></description>
        </item>
        <item>
            <title><![CDATA[Fælleskørsel fra BikX 21-06-2009 12:00]]></title>
            <link><![CDATA[http://www.mctraef.dk/index.php?inc=traef&id=34]]></link>
            <description></description>
        </item>
    </channel>
</rss>


Ovenstående kode validerede fint.
Avatar billede donslund Nybegynder
18. juni 2009 - 11:19 #12
Jeg skriver det manuelt.

print '<?xml version="1.0" encoding="UTF-8"?>';
print '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">';
print '<channel>';
print '<atom:link href="http://www.mctraef.dk/traeffeed.php" rel="self" type="application/rss+xml" />';
print '<title>mctraef.dk</title>';
print '<link>http://www.mctraef.dk</link>';
print '<description>'.utf8_encode("MCtræf i hele Danmark").'</description>';
$hent_naeste = "select *, traef.id AS t_id from traef_event, traef where traef_event.traef_id = traef.id AND starttid > '".date("U")."'order by starttid limit 10";
$koer_hent_naeste = mysql_query($hent_naeste) or die(mysql_error());
while($row=mysql_fetch_array($koer_hent_naeste)){
print '<item>';
print '<title><![CDATA['.utf8_encode($row['navn'].' '.date("d-m-Y H:i", $row["starttid"])).']]></title>';
print '<description><![CDATA['.utf8_encode($row['beskrivelse']).']]></description>';
print '<guid>http://www.mctraef.dk/index.php?inc=traef&amp;id='.$row["t_id"].'</guid>';
print '</item>';
}
print '</channel>';
print '</rss>';

Har rettet lidt til som du kan se. Endeligt resultat: http://www.mctraef.dk/traeffeed.php
Avatar billede repox Seniormester
18. juni 2009 - 11:28 #13
Problematikken i det der er at du reelt set får alting til at stå på en enkelt linie. Det vil sige at når du vil fejlsøge i din XML vil du altid få at vide at fejlen ligger i linie 1. Ikke særligt behjælpeligt i en linie på 3000 tegn.

Hvis du får det sat pænt op, vil du også hurtigt kunne finde fejl i din XML og du vil også have et bedre overblik.

Istedet for at printe dit output ud bør du lægge det i en variabel og derefter kan du bruge DOM for at 'forskønne det':

---------------------------------
$rss = '<?xml version="1.0" encoding="UTF-8"?>';
$rss .= '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">';
$rss .= '<channel>';
$rss .= '<atom:link href="http://www.mctraef.dk/traeffeed.php" rel="self" type="application/rss+xml" />';
$rss .= '<title>mctraef.dk</title>';
$rss .= '<link>http://www.mctraef.dk</link>';
$rss .= '<description>'.utf8_encode("MCtræf i hele Danmark").'</description>';
$hent_naeste = "select *, traef.id AS t_id from traef_event, traef where traef_event.traef_id = traef.id AND starttid > '".date("U")."'order by starttid limit 10";
$koer_hent_naeste = mysql_query($hent_naeste) or die(mysql_error());
while($row=mysql_fetch_array($koer_hent_naeste))
{
    $rss .= '<item>';
    $rss .= '<title><![CDATA['.utf8_encode($row['navn'].' '.date("d-m-Y H:i", $row["starttid"])).']]></title>';
    $rss .= '<description><![CDATA['.utf8_encode($row['beskrivelse']).']]></description>';
    $rss .= '<guid>http://www.mctraef.dk/index.php?inc=traef&amp;id='.$row["t_id"].'</guid>';
    $rss .= '</item>';
}
$rss .= '</channel>';
$rss .= '</rss>';

$doc = new DOMDocument('1.0');
$doc->preserveWhiteSpace = false;
$doc->loadXML($rss);
$doc->formatOutput = true;
$data = $doc->saveXML();

echo $data;
---------------------------------

Prøv det...
Avatar billede donslund Nybegynder
18. juni 2009 - 11:33 #14
Ja, det blev jo unægteligt noget kønnere :-)

Hvad mener validatoren med dette: http://validator.w3.org/feed/check.cgi?url=http%3A%2F%2Fwww.mctraef.dk%2Ftraeffeed.php

guid element?
Avatar billede repox Seniormester
18. juni 2009 - 11:43 #15
Det betyder at du burde have et element der hedder guid der unikt identificerer en item.

Typisk vil <link> pege på den specifikke nyhed og derfor kan du i princippet lade <guid> indeholde det samme.

Men nogle vælger jo at liste de fulde nyheder på en og samme side og linker derfor til den samme side i alle items->link elementerne. Så kan man med fordel bruge <guid> elementet til at adskille nyhederne i feedet.
Avatar billede donslund Nybegynder
18. juni 2009 - 11:47 #16
Godt så. Så er det vist tid til svar og point.
Avatar billede repox Seniormester
18. juni 2009 - 11:52 #17
Jamen, svar fra mig, så :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester