2011-06-02 46 views
2
<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提要,我想通過使用SAX解析器。但我無法做到這一點從本取描述,請幫助和建議我所有可能的方式這樣做 thanx如何來從XML文件CDATA部分文字

+0

什麼編程語言?另外,我們只能看到描述元素的結束標記,所以要更清楚你需要什麼。我假設你想提取這兩個圖像。 – Mel 2011-06-02 12:35:48

+0

如果您確實想要解析描述本身,而不是將其解析出RSS,則需要兩步處理。取決於您希望成爲SAX的HTML容忍度如何僅適用於第一步。 – Tobias 2011-06-02 12:46:11

回答

2

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

不知道你想用哪種語言來解析。由於我的工作只是在C++中,這裏是用AX解析器生成書面CDATA解析器:

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()); 

免責聲明:我沒有測試上面的代碼,小錯誤是可能的。