Parser xml do czytnika RSS

0

Witam. Kończę pisać parser xml do czytnika RSS w C, jednak natknąłem się na pewien problem. Formatowanie treści znacznika <description> jest dość niejednolite w zależności od kanału, nie wiem jak to parsować w możliwe jak najbardziej uniwersalny sposób. Poniżej załączam przykłady takich znaczników. Każdy z nich czymś się różni, a jako że nie znam xml'a nie wiem na jakiej zasadzie działa to formatowanie, od czego zależy. Byłbym wdzięczny za jakieś pomysły na parsowanie tego, bo sam nie wymyśliłem do tej pory niczego, co by było wystarczająco skuteczne, zawsze pozostają jakieś niedoskonałości.

Tutaj przykłady:

<description>&lt;img src='http://bi.gazeta.pl/im/5/11466/z11466495M.jpg' align='left' hspace='4' vspace='2'&gt;Najważniejsze w odchudzaniu to nie jeść po 18.00 i zrezygnować z węglowodanów i alkoholu? Tak było kiedyś. Dzisiaj już niekoniecznie. Zasady żywienia zmieniają się jak pory roku. Czy jesteś na bieżąco?&lt;img width='1' height='1' src='http://gazeta.pl.feedsportal.com/c/32739/f/576258/s/1e0c9316/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=en&amp;title=Nowe+zasady+odchudzania&amp;link=http%3A%2F%2Fodwazsie.gazeta.pl%2Fodwagi%2F56%2C97220%2C11465541%2CNowe_zasady_odchudzania.html" target="_blank"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=Nowe+zasady+odchudzania&amp;link=http%3A%2F%2Fodwazsie.gazeta.pl%2Fodwagi%2F56%2C97220%2C11465541%2CNowe_zasady_odchudzania.html" target="_blank"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/130979015067/u/192/f/576258/c/32739/s/1e0c9316/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/130979015067/u/192/f/576258/c/32739/s/1e0c9316/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/130979015067/u/192/f/576258/c/32739/s/1e0c9316/a2t.img" border="0"/&gt;</description>
<description><![CDATA[<img align="right" class="rss_getrssnews_obrazek" width="50" src="http://m.onet.pl/_m/c4ea9482a193bfe1ad29e4ea27ec7114,1,1.jpg" alt=""> - Pytałem co powiedzieć ludziom na zewnątrz. Powiedziała mi: proszę powiedzieć, że jest ważne, by Ukraina szła ku Europie, i że jestem w dobrym nastroju - powiedział w "Faktach po Faktach" Paweł Kowal. Polityk w czwartek spotkał się z przebywającą w więzieniu byłą premier Ukrainy - Julią Tymoszenko. ]]></description>
<description><![CDATA[
W ćwierćfinale gry podwójnej turnieju WTA Tour na zielonej odmianie kortów ziemnych w Charleston (pula nagród 740 tys. dol.) Klaudia Jans-Ignacik i Rosjanka Ałła Kudriawcewa przegrały z Amerykankami Liezel Huber i Lisą Raymond (1.) 5:7, 2:6. <a href="http://sport.wp.pl">sport.wp.pl</a>
]]></description>
<description>Motocyklista Jakub Przygoński był trzeci na piątym, ostatnim etapie Abu Dhabi Desert Challenge, pierwszej eliminacji mistrzostw świata FIM w rajdach terenowych. W klasyfikacji generalnej Polak zajął szóste miejsce. Triumfował Hiszpan Marc Coma.&lt;img width='1' height='1' src='http://interia.pl.feedsportal.com/c/34004/f/625088/s/1e28154d/mf.gif' border='0'/&gt;&lt;div class='mf-viral'&gt;&lt;table border='0'&gt;&lt;tr&gt;&lt;td valign='middle'&gt;&lt;a href="http://share.feedsportal.com/viral/sendEmail.cfm?lang=en&amp;title=Abu+Dhabi+Desert+Challenge%3A+Przygo%C5%84ski+trzeci+na+ostatnim+etapie&amp;link=http%3A%2F%2Fsport.interia.pl%2Fwiadomosci-dnia%2Fnews%2Fabu-dhabi-desert-challenge-przygonski-trzeci-na-ostatnim%2C1782072" target="_blank"&gt;&lt;img src="http://res3.feedsportal.com/images/emailthis2.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign='middle'&gt;&lt;a href="http://res.feedsportal.com/viral/bookmark.cfm?title=Abu+Dhabi+Desert+Challenge%3A+Przygo%C5%84ski+trzeci+na+ostatnim+etapie&amp;link=http%3A%2F%2Fsport.interia.pl%2Fwiadomosci-dnia%2Fnews%2Fabu-dhabi-desert-challenge-przygonski-trzeci-na-ostatnim%2C1782072" target="_blank"&gt;&lt;img src="http://res3.feedsportal.com/images/bookmark.gif" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://da.feedsportal.com/r/130577711994/u/192/f/625088/c/34004/s/1e28154d/a2.htm"&gt;&lt;img src="http://da.feedsportal.com/r/130577711994/u/192/f/625088/c/34004/s/1e28154d/a2.img" border="0"/&gt;&lt;/a&gt;&lt;img width="1" height="1" src="http://pi.feedsportal.com/r/130577711994/u/192/f/625088/c/34004/s/1e28154d/a2t.img" border="0"/&gt;</description>
1

W treści albo jest blok CDATA, który zawiera kod HTML, albo nie -- i wtedy wszystkie znaki <, >, & są kodowane do encji. W zasadzie musisz obsłużyć tylko dwa przypadki:

  1. Treść w <description> zaczyna się od <![CDATA[ -- wtedy kopiujesz treść aż do napotkania ciągu ]]>, co oznacza koniec bloku. Treść jest kodem HTML.
  2. W przeciwnym wypadku kopiujesz całą treść w <description> a następnie zamieniasz wszystkie encje &lt;, &gt;, &amp; odpowiednio na znaki <, >, &. I znów -- treść jest HTML-em.

1 użytkowników online, w tym zalogowanych: 0, gości: 1