首页 > 编程语言 >C++Day13 tinyxml2解析rss文件

C++Day13 tinyxml2解析rss文件

时间:2023-01-27 21:23:12浏览次数:84  
标签:xml title tinyxml2 C++ item XMLElement Day13 节点 rss

一、任务与思路

使用tinyxml解析rss文件,使用std::regex(正则表达式)去除html标签,并生成一个pagelib.txt,格式如下

<doc>
    <docid>1</docid>
    <title>...</title>
    <link>...</link>
    <description>...</description>
    <content>...</content>
</doc>
<doc>
    <docid>2</docid>
    <title>...</title>
    <link>...</link>
    <description>...</description>
    <content>...</content>
</doc>
<doc>
  ...
</doc>
 1 // 参考接口
 2 
 3 struct RssItem{
 4     string title;
 5     string link;
 6     string description;
 7     string content;
 8 };
 9 
10 class RssReader{
11 public:
12     RssReader(){};
13 
14     //解析xml文件,存入vector
15     void parseRss(const char *filename);
16 
17     //将容器的信息保存到文件中
18     void dump(const string &filename);
19 
20 private:
21     vector<RssItem> m_rss;
22 };

 RSS文件的格式:

<rss>
    <channel>
       <item>
       <title>xxx</title>
      <link>   </link>
       <description>   </description>
      <content:encoded>   </content:encoded>
       </item>
       <item>
         <title>  </title>
         <link>   </link>
         <description>   </description>
         <content:encoded>   </content:encoded>
       </item>
       <item>
        ...
       </item>
    </channel>
</rss>

解题思路:使用tinyxml2这个第三方库进行解析,所以可通过阅读源码看timyxml2如何解析第三方库,解析完成一个item后,通过正则表达式去除HTML标签,然后再去读第二个item,最后就是遍历vector,讲读取到的信息存到另外一个文件

二、陌生第三方库的学习

1 XMLDocument xml;  // 1、创建xml类,读取xml文件
2 xml.LoadFile(filename); // 2、读取xml文件  LoadFile传入的要是C风格字符串
3 XMLElement *rss = xml.RootElement(); //3、拿到xml文件的根节点rss
4 XMLElement *channel = rss->FirstChildElement("channel");  //4、拿到channel节点
5 XMLElement *item = channel->FirstChildElement("item"); //5、拿到item节点

解析item中的内容并保存

1 XMLElement *item_title = item->FirstChildElement("title");  //获取title中的内容
2 rss_item.title = item_title->GetText();  //保存节点的内容

正则表达式去除html标签

1 regex reg("<[^>]*>");  
2 //std::regex中的regex_replace方法   regex_replace() :用格式化的替换文本替换出现的正则表达式
3 rss_item.description = regex_replace(rss_item.description, reg, "");

三、代码实现

 1 //获取Rss文件中channel节点下item节点的内容,存入结构体vector
 2 void RssReader::parseRss(const char *filename){
 3 
 4     XMLDocument xml; // 1、声明xml类,读取xml文件
 5     xml.LoadFile(filename); // 2、读取xml文件  LoadFile传入的要是C风格字符串
 6     XMLElement *rss = xml.RootElement(); //3、拿到xml文件的根节点rss
 7     XMLElement *channel = rss->FirstChildElement("channel");  //4、拿到channel节点指针
 8     XMLElement *item = channel->FirstChildElement("item"); //5、拿到item节点
 9 
10     while(item){
11         RssItem rss_item;  //数据保存到结构体
12         regex reg("<[^>]*>");  //正则表达式去除html标签
13 
14         //获取title节点指针,内容保存到结构体变量
15         XMLElement *item_title = item->FirstChildElement("title");
16         rss_item.title = item_title->GetText();  //保存节点的内容
17 
18         //获取link节点指针,内容保存到结构体变量
19         XMLElement *item_link = item->FirstChildElement("link");
20         rss_item.link = item_link->GetText();
21 
22         //获取desc节点指针,内容保存到结构体变量
23         XMLElement *item_description = item->FirstChildElement("description");
24         rss_item.description = item_description->GetText();
25 
26         rss_item.description = regex_replace(rss_item.description, reg, ""); //去除html标签
27 
28         XMLElement *item_content = item->FirstChildElement("content:encoded");
29         rss_item.content = item_content->GetText();
30 
31         rss_item.content = regex_replace(rss_item.content, reg, "");
32 
33        m_rss.push_back(rss_item);  //存入结构体
34        item = item->NextSiblingElement(); //寻找下一个item节点
35     }
36 }
37 
38 //内容按指定格式输出到文件
39 void RssReader::dump(const string &filename){
40    
41     ofstream ofs(filename);
42     if(!ofs.good()){
43         cerr << "ofstream is not good" << endl;
44         return;
45     }
46 
47     for(size_t idx = 0; idx < m_rss.size(); ++idx){
48         ofs << "<doc>" << "\n"
49             << "\t" << "<docid>" << idx + 1 << "</docid>" << "\n"
50             << "\t" << "<title>" << m_rss[idx].title << "</title>" << "\n"
51             << "\t" << "<link>" << m_rss[idx].link << "</link>" << "\n"
52             << "\t" << "<description>" << m_rss[idx].description << "</description>" << "\n"
53             << "\t" << "<content>" << m_rss[idx].content << "</content>" << "\n"
54             << "</doc>" << endl;
55     }
56     ofs.close();
57 }

测试代码

 1 #include"tiny.h"
 2 
 3 
 4 int main(int argc, char **argv)
 5 {
 6 
 7     RssReader s1;
 8     s1.parseRss("coolshell.xml");
 9 
10     s1.dump("pagelib.txt");
11     return 0;
12 }

编译时要与tinyxml2.cpp一起编译

标签:xml,title,tinyxml2,C++,item,XMLElement,Day13,节点,rss
From: https://www.cnblogs.com/YongSir/p/17069127.html

相关文章

  • 用VC++访问XML文件
    用微软的DOM,MSXML4//引入msxml4.dll#import"C:/WINNT.0/system32/msxml4.dll"//创建XMLDOMDocument指针MSXML2::IXMLDOMDocumentPtrpXMLDoc;//初始化COM接口::C......
  • Xmake v2.7.6 发布,新增 Verilog 和 C++ Modules 分发支持
    Xmake是一个基于Lua的轻量级跨平台构建工具。它非常的轻量,没有任何依赖,因为它内置了Lua运行时。它使用xmake.lua维护项目构建,相比makefile/CMakeLists.txt,配置语......
  • C/C++工业数据分析与文件信息管理系统
    C/C++工业数据分析与文件信息管理系统大连理工大学《程序设计基础A课程设计》设计报告工业数据分析与文件信息管理系统学生姓名:院系、班级:学号:联系电......
  • C++算术计算器[2023-01-27]
    C++算术计算器[2023-01-27]面向对象程序设计C++作业考核一、考核内容使用C++语言,设计开发一个算术计算器,能够根据用户输入计算输出表达式结果。二、基本要求1.能够支......
  • c++ 利用开发人员命令提示工具查看对象模型
      1.跳转盘符   C:           //(以C盘为例,文件储存在哪盘跳转哪盘)例:  2.跳转文件路径cd具体路径例:      ......
  • c++语法 继承——虚基类
        #include<iostream>usingnamespacestd;classAnimal{public: intm_age;};classSheep:virtualpublicAnimal{};classTuo:virtualpublicAnimal{};c......
  • 关于#c++#的问题,如何解决
    提问: 又出了另一个错:```c++#include<iostream>#include<stdio.h>#include<algorithm>intco=0;usingnamespacestd;charb[10000000];intmain(){......
  • 如何在WINDOWS下编译BOOST C++库
    如何在WINDOWS下编译BOOSTC++库cheungmine2008-6-25 写出来,怕自己以后忘记了,也为初学者参考。使用VC8.0和boost1.35.0。 1)下载boost​​​http://www.boost.o......
  • 对于C/C++代码的一些建议之变量规范
    作为一名合格的码农,写代码的时候一定要知道自己在干什么什么是代码优化?为了让代码更易于理解?为了让团队协作更加便利?为了后续的修改工作不再那么频繁或者是复杂?主......
  • Piccolo中的C++语法
    很久没用C++了,趁着过年跟家鑫碰面,找了一些Piccolo上的看着难懂的C++语法请教他,记录一下。【文件名及后缀】之前一直都以为C++的所有文件都必须是.h或者.cpp为后缀,却到看......