как извлечь текст из раздела cdata файлов xml - PullRequest
2 голосов
/ 02 июня 2011
<text>
    <![CDATA[
        <img style="vertical-align: middle;" src="http://www.bjp.org/images/stories/economic_cell_1.jpg" width="600" />
        <img style="vertical-align: middle;" src="http://www.bjp.org/images/stories/economic_cell_2.jpg" width="600" />
    ]]>
</text>
</description>

это мой RSS-канал. Я хочу получить описание из него с помощью синтаксического анализатора саксофона. Но я не могу этого сделать, поэтому, пожалуйста, помогите и предложите мне все возможные способы сделать это заранее спасибо

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

CDATA просто говорит парсеру не рассматривать угловые скобки как теги XML.Вы получаете содержимое, как и любые другие символьные данные внутри тега.Поскольку вы ничего не упомянули, вот Python:

import xml.sax
from cStringIO import StringIO

class Handler(xml.sax.handler.ContentHandler):
    def characters(self, content):
        print content

rss = '<text><![CDATA[<img style="vertical-align: middle;" src="http://www.bjp.org/images/stories/economic_cell_1.jpg" width="600" /><img style="vertical-align: middle;" src="http://www.bjp.org/images/stories/economic_cell_2.jpg" width="600" />]]></text>'

xml.sax.parse(StringIO(rss), Handler())
0 голосов
/ 03 июня 2011

Не знаю, какой язык вы хотите использовать для разбора. Поскольку я работаю только на C ++, вот парсер для CDATA, написанный с использованием генератора парсеров AX:

std::string cdata;
auto cdata_rule = "<![CDATA[" & *(axe::r_any() - "]]>") >> cdata & "]]>";
// now do the parsing of input
cdata_rule(input.begin(), input.end());

// parse img elements
std::vector<std::string> sources; // all your img sources will be here
auto src_rule = "src=\"" & *(r_any() - '"') >> r_push_back(sources) & '"';
auto ignore = *(r_any() - "src=");
auto tail = *(r_any() - "/>") & "/>" & *r_any(" \t\n");
auto img_rule = *("<img & ignore & src_rule & tail);
auto result = img_rule(cdata.begin(), cdata.end());

Отказ от ответственности: я не тестировал код выше, возможны незначительные ошибки.

...