tinyxml

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

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

int example_1()
{
	XMLDocument doc;
	doc.LoadFile( "resources/dream.xml" );

	return doc.ErrorID();
}

example3就是处理一个字符串

int example_3()
{
	static const char* xml =
		"<?xml version=\"1.0\"?>"
		"<!DOCTYPE PLAY SYSTEM \"play.dtd\">"
		"<PLAY>"
		"<TITLE>A Midsummer Night's Dream</TITLE>"
		"</PLAY>";

	XMLDocument doc;
	doc.Parse( xml );

//可能需要注意这个地方读取文件以后也可以直接使用

	XMLElement* titleElement = doc.FirstChildElement( "PLAY" )->FirstChildElement( "TITLE" );
	const char* title = titleElement->GetText();
	printf( "Name of play (1): %s\n", title );

	XMLText* textNode = titleElement->FirstChild()->ToText();
	title = textNode->Value();
	printf( "Name of play (2): %s\n", title );

	return doc.ErrorID();
}

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

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

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

#include <iostream>
#include <iterator>
#include <regex>
#include <string>
 
int main()
{
   std::string text = "Quick brown fox";
   std::regex vowel_re("a|e|i|o|u");
 
   // 写结果到输出迭代器
   std::regex_replace(std::ostreambuf_iterator<char>(std::cout),
                      text.begin(), text.end(), vowel_re, "*");
 
   // 构造保有结果的字符串
   std::cout << '\n' << std::regex_replace(text, vowel_re, "[$&]") << '\n';
}

//输出结果
Q**ck br*wn f*x
Q[u][i]ck br[o]wn f[o]x

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

#include "tinyxml2.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <regex>
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::ofstream;
using std::regex;
using tinyxml2::XMLDocument;
using tinyxml2::XMLElement;
using tinyxml2::XMLText;

struct RssItem
{
    string title;
    string link;
    string description;
    string content;
};


class RssReader
{
public:
    RssReader(int size){
        _rss.reserve(size);
    }
    //使用string类型也可以接收char*类型
    //如果使用char*类型的不能接收string类型
    int parseRss(const char * filename){
        XMLDocument doc;
        if(doc.LoadFile(filename) != tinyxml2::XML_SUCCESS){
            //实际上这是一个enum定义数值是0,所以只需要返回值不为0的时候就可以
            cout << "doc open error! " << endl;
            return 1;
        }
        for (tinyxml2::XMLElement* titleElement = doc.FirstChildElement("rss")>FirstChildElement("channel")->FirstChildElement("item"); 
            titleElement; titleElement = titleElement->NextSiblingElement("item")) {
            //这个地方主要是用到nextsibingElement用来访问下一个节点
            struct RssItem rss;
            //获取title内容
            XMLElement * element = titleElement->FirstChildElement("title");
            if(element){
                const char* title = element->GetText();
                rss.title = title;
            }

            element = titleElement->FirstChildElement("link");
            if(element){
                const char * link = element->GetText();
                rss.link = link;
            }

            element = titleElement->FirstChildElement("description");
            if(element){
                const char * description= element->GetText();
                rss.description = description;
            }
            element = titleElement->FirstChildElement("content:encoded");
            if(element){
                const char * content= element->GetText();
                rss.content = content;
            }

            _rss.push_back(rss);
        }
        //解析
        return 0;
    }
    void dump(const string & filename){
        ofstream ofs(filename.c_str());
        int cnt = 1;
        while(!_rss.empty()){
            ofs << "<doc>" << endl;
            ofs << "    " <<"<docid>" << cnt++ << "</docid>" << endl;
            RssItem rss;
            rss = _rss.front();

            regex pattern("<.*?>");
            string replacement = "";
            string result = regex_replace(rss.title, pattern, replacement);
            ofs << "    " << "<title>" << result << "</title>" <<endl;

            result = regex_replace(rss.link, pattern, replacement);
            ofs << "    " << "<link>" << result << "</link>" <<endl;

            result = regex_replace(rss.description, pattern, replacement);
            ofs << "    " << "<description>" << result << "</description>" <<endl;

            result = regex_replace(rss.content, pattern, replacement);
            ofs << "    " << "<content>" << result << "</content>" <<endl;
            _rss.pop_back();
        }
        ofs.close();
    }//输出
private:
    vector<RssItem> _rss;
};   



int main()
{
    RssReader rs(10);
    rs.parseRss("feed.txt");
    rs.dump("content.txt");
    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值