• tinyxml


    github下载相关的软件包,其中有四个文件需要主要需要关注就是分别是tinyxml12.cpp,tinyxml12.h,rss网页xml文件,还有就是官方给的test文件tinyxmltest.cpp。

    example1就是提供一个打开文件的方式

    1. int example_1()
    2. {
    3. XMLDocument doc;
    4. doc.LoadFile( "resources/dream.xml" );
    5. return doc.ErrorID();
    6. }

    example3就是处理一个字符串

    1. int example_3()
    2. {
    3. static const char* xml =
    4. ""
    5. ""
    6. ""
    7. "A Midsummer Night's Dream"
    8. "";
    9. XMLDocument doc;
    10. doc.Parse( xml );
    11. //可能需要注意这个地方读取文件以后也可以直接使用
    12. XMLElement* titleElement = doc.FirstChildElement( "PLAY" )->FirstChildElement( "TITLE" );
    13. const char* title = titleElement->GetText();
    14. printf( "Name of play (1): %s\n", title );
    15. XMLText* textNode = titleElement->FirstChild()->ToText();
    16. title = textNode->Value();
    17. printf( "Name of play (2): %s\n", title );
    18. return doc.ErrorID();
    19. }

    最后在编译的时候记得gcc test.cc tinyxml.cc 进行联合编译,要不然的话不能知道相关的在hpp中的函数定义在什么位置。

    然后就可以借助于regex函数借助于正则表达式处理字符串文件

    可以从c++参考文档中正则表达式获得

    1. #include
    2. #include
    3. #include
    4. #include
    5. int main()
    6. {
    7. std::string text = "Quick brown fox";
    8. std::regex vowel_re("a|e|i|o|u");
    9. // 写结果到输出迭代器
    10. std::regex_replace(std::ostreambuf_iterator<char>(std::cout),
    11. text.begin(), text.end(), vowel_re, "*");
    12. // 构造保有结果的字符串
    13. std::cout << '\n' << std::regex_replace(text, vowel_re, "[$&]") << '\n';
    14. }
    15. //输出结果
    16. Q**ck br*wn f*x
    17. Q[u][i]ck br[o]wn f[o]x

    当然在下面的文档中是通过gpt获得的一种替换方法

    1. #include "tinyxml2.h"
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. using std::cout;
    8. using std::endl;
    9. using std::string;
    10. using std::vector;
    11. using std::ofstream;
    12. using std::regex;
    13. using tinyxml2::XMLDocument;
    14. using tinyxml2::XMLElement;
    15. using tinyxml2::XMLText;
    16. struct RssItem
    17. {
    18. string title;
    19. string link;
    20. string description;
    21. string content;
    22. };
    23. class RssReader
    24. {
    25. public:
    26. RssReader(int size){
    27. _rss.reserve(size);
    28. }
    29. //使用string类型也可以接收char*类型
    30. //如果使用char*类型的不能接收string类型
    31. int parseRss(const char * filename){
    32. XMLDocument doc;
    33. if(doc.LoadFile(filename) != tinyxml2::XML_SUCCESS){
    34. //实际上这是一个enum定义数值是0,所以只需要返回值不为0的时候就可以
    35. cout << "doc open error! " << endl;
    36. return 1;
    37. }
    38. for (tinyxml2::XMLElement* titleElement = doc.FirstChildElement("rss")>FirstChildElement("channel")->FirstChildElement("item");
    39. titleElement; titleElement = titleElement->NextSiblingElement("item")) {
    40. //这个地方主要是用到nextsibingElement用来访问下一个节点
    41. struct RssItem rss;
    42. //获取title内容
    43. XMLElement * element = titleElement->FirstChildElement("title");
    44. if(element){
    45. const char* title = element->GetText();
    46. rss.title = title;
    47. }
    48. element = titleElement->FirstChildElement("link");
    49. if(element){
    50. const char * link = element->GetText();
    51. rss.link = link;
    52. }
    53. element = titleElement->FirstChildElement("description");
    54. if(element){
    55. const char * description= element->GetText();
    56. rss.description = description;
    57. }
    58. element = titleElement->FirstChildElement("content:encoded");
    59. if(element){
    60. const char * content= element->GetText();
    61. rss.content = content;
    62. }
    63. _rss.push_back(rss);
    64. }
    65. //解析
    66. return 0;
    67. }
    68. void dump(const string & filename){
    69. ofstream ofs(filename.c_str());
    70. int cnt = 1;
    71. while(!_rss.empty()){
    72. ofs << "" << endl;
    73. ofs << " " <<"" << cnt++ << "" << endl;
    74. RssItem rss;
    75. rss = _rss.front();
    76. regex pattern("<.*?>");
    77. string replacement = "";
    78. string result = regex_replace(rss.title, pattern, replacement);
    79. ofs << " " << ""</span> << result << <span class="hljs-string">"" <
    80. result = regex_replace(rss.link, pattern, replacement);
    81. ofs << " " << "" << result << "" <
    82. result = regex_replace(rss.description, pattern, replacement);
    83. ofs << " " << "" << result << "" <
    84. result = regex_replace(rss.content, pattern, replacement);
    85. ofs << " " << "" << result << "" <
    86. _rss.pop_back();
    87. }
    88. ofs.close();
    89. }//输出
    90. private:
    91. vector _rss;
    92. };
    93. int main()
    94. {
    95. RssReader rs(10);
    96. rs.parseRss("feed.txt");
    97. rs.dump("content.txt");
    98. return 0;
    99. }

  • 相关阅读:
    修改禅道启动因mysql端口被占用问题
    Java Double byteValue()方法具有什么功能呢?
    【问题之书】
    分布式运用之企业级日志ELFK+logstash的过滤模块
    【Opencv】-----倾斜图片转正
    Fiddler收费没得用?这款抓包神器 Github star 过万,一个字:香
    RabbitMQ之死信队列
    Elasticsearch:使用 Filebeat 从 Node.js Web 应用程序提取日志
    序列化(三)JSON
    43%非常看好TypeScript…解读“2022前端开发者现状报告”
  • 原文地址:https://blog.csdn.net/weixin_61057535/article/details/139824201