C++ XML文件解析
使用tinyxml2库,git地址https://github.com/leethomason/tinyxml2
只需要使用tinyxml2.h tinyxml2.cpp即可,同时需要using namespace tinyxml2
这里给出从官方test提取出的一些常用的操作
- namespace XMLDemo {
- static string fileNames[] = { "./resources/dream.xml",
- "./resources/utf8test.xml", "./resources/empty.xml",
- "./resources/utf8testverify.xml", };
- static void timeTest() {
- XMLDocument* doc = new XMLDocument();
- clock_t startTime = clock();
- doc->LoadFile(fileNames[].c_str());
- clock_t loadTime = clock();
- int errorID = doc->ErrorID();
- delete doc;
- doc = ;
- clock_t deleteTime = clock();
- printf("Test file '%s' loaded. ErrorID=%d\n", fileNames[].c_str(),
- errorID);
- if (!errorID) {
- printf("Load time=%lf sec\n",
- (double) (loadTime - startTime) / CLOCKS_PER_SEC);
- printf("Delete time=%lf sec\n",
- (double) (deleteTime - loadTime) / CLOCKS_PER_SEC);
- printf("Total time=%lf sec\n",
- (double) (deleteTime - startTime) / CLOCKS_PER_SEC);
- }
- }
- static void parseTest() {
- 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);
- }
- static void valueTest() {
- static const char* xml = "<information>"
- " <attributeApproach v='2' />"
- " <textApproach>"
- " <v>2</v>"
- " </textApproach>"
- "</information>";
- XMLDocument doc;
- doc.Parse(xml);
- int v0 = ;
- int v1 = ;
- XMLElement* attributeApproachElement =
- doc.FirstChildElement()->FirstChildElement("attributeApproach");
- attributeApproachElement->QueryIntAttribute("v", &v0);
- XMLElement* textApproachElement =
- doc.FirstChildElement()->FirstChildElement("textApproach");
- textApproachElement->FirstChildElement("v")->QueryIntText(&v1);
- printf("Both values are the same: %d and %d\n", v0, v1);
- }
- static void DOMTest() {
- // Test: Programmatic DOM
- // Build:
- // <element>
- // <!--comment-->
- // <sub attrib="1" />
- // <sub attrib="2" />
- // <sub attrib="3" >& Text!</sub>
- // <element>
- XMLDocument* doc = new XMLDocument();
- XMLNode* element = doc->InsertEndChild(doc->NewElement("element"));
- XMLElement* sub[] = { doc->NewElement("sub"), doc->NewElement("sub"),
- doc->NewElement("sub") };
- for (int i = ; i < ; ++i) {
- sub[i]->SetAttribute("attrib", i);
- }
- element->InsertEndChild(sub[]);
- XMLNode* comment = element->InsertFirstChild(doc->NewComment("comment"));
- comment->SetUserData((void*) );
- element->InsertAfterChild(comment, sub[]);
- element->InsertAfterChild(sub[], sub[]);
- sub[]->InsertFirstChild(doc->NewText("& Text!"));
- doc->Print();
- printf("-------------------------------------------------------------\n");
- // And now deletion:
- element->DeleteChild(sub[]);
- doc->DeleteNode(comment);
- element->FirstChildElement()->SetAttribute("attrib", true);
- element->LastChildElement()->DeleteAttribute("attrib");
- doc->Print();
- printf("-------------------------------------------------------------\n");
- int value1 = ;
- int value2 = doc->FirstChildElement()->LastChildElement()->IntAttribute(
- "attrib", );
- int result =
- doc->FirstChildElement()->LastChildElement()->QueryIntAttribute(
- "attrib", &value1);
- doc->Print();
- printf("-------------------------------------------------------------\n");
- {
- XMLPrinter streamer;
- doc->Print(&streamer);
- printf("%s", streamer.CStr());
- }
- {
- XMLPrinter streamer(, true);
- doc->Print(&streamer);
- }
- doc->SaveFile("./resources/pretty.xml");
- doc->SaveFile("./resources/compact.xml", true);
- delete doc;
- }
- static void attrTest() {
- const char* str = "<doc/>";
- XMLDocument doc;
- doc.Parse(str);
- XMLElement* ele = doc.FirstChildElement();
- int iVal, iVal2;
- double dVal, dVal2;
- ele->SetAttribute("str", "strValue");
- ele->SetAttribute("int", );
- ele->SetAttribute("double", -1.0);
- const char* cStr = ele->Attribute("str");
- ele->QueryIntAttribute("int", &iVal);
- cout << iVal << endl;
- ele->QueryDoubleAttribute("double", &dVal);
- ele->QueryAttribute("int", &iVal2);
- ele->QueryAttribute("double", &dVal2);
- cout << dVal2 << endl;
- }
- static void textTest() {
- const char* str = "<foo>This is text</foo>";
- XMLDocument doc;
- doc.Parse(str);
- XMLElement* element = doc.RootElement();
- cout << element->GetText() << endl;
- element->SetText("abcd");
- cout << element->GetText() << endl;
- doc.Print();
- printf("-------------------------------------------------------------\n");
- }
- static void printerTest() {
- FILE* printerfp = fopen("resources/printer.xml", "w");
- XMLPrinter printer(printerfp);
- printer.OpenElement("foo");
- printer.PushAttribute("attrib-text", "text");
- printer.PushAttribute("attrib-int", int());
- printer.PushAttribute("attrib-unsigned", unsigned());
- printer.PushAttribute("attrib-int64", int64_t());
- printer.PushAttribute("attrib-bool", true);
- printer.PushAttribute("attrib-double", 4.0);
- printer.CloseElement();
- fclose(printerfp);
- XMLDocument doc;
- doc.LoadFile("resources/printer.xml");
- const XMLDocument& cdoc = doc;
- const XMLAttribute* attrib = cdoc.FirstChildElement("foo")->FindAttribute(
- "attrib-text");
- attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-int");
- cout << attrib->Value() << endl;
- attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-unsigned");
- cout << attrib->IntValue() << endl;
- attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-bool");
- cout << attrib->BoolValue() << endl;
- attrib = cdoc.FirstChildElement("foo")->FindAttribute("attrib-double");
- cout << attrib->DoubleValue() << endl;
- }
- }
C++ XML文件解析的更多相关文章
- 通过正则表达式实现简单xml文件解析
这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...
- 八、Android学习第七天——XML文件解析方法(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...
- android基础知识13:AndroidManifest.xml文件解析
注:本文转载于:http://blog.csdn.net/xianming01/article/details/7526987 AndroidManifest.xml文件解析. 1.重要性 Andro ...
- Android之AndroidManifest.xml文件解析
转自:Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文 ...
- 9.XML文件解析
一.XML简介 XML(EXtensible Markup Language),可扩展标记语言 特点:XML与操作系统.编程语言的开发平台无关 实现不同系统之间的数据交换 作用:数据交互 配置应用程序 ...
- Python实现XML文件解析
1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...
- Python3将xml文件解析为Python对象
一.说明 从最开始写javascript开始,我就很烦感使用getElementById()等函数来获取节点的方法,获取了一个节点要访问其子孙节点要么child半天要么就再来一个getElementB ...
- XML文件解析-DOM4J方式和SAX方式
最近遇到的工作内容都是和xml内容解析相关的. 1图片数据以base64编码的方式保存在xml的一个标签中,xml文件通过接口的方式发送给我,然后我去解析出图片数据,对图片进行进一步处理. 2.xml ...
- java基础之概谈xml文件解析
XML已经成为一种非常通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 诸多web应用框架,其可配置的编程方式,给我们的开发带来了非常大程度的便捷,但细细 ...
- XML文件解析之JDOM解析
1.JDOM介绍 JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2 ...
随机推荐
- LeetCode6.Z字形变换 JavaScript
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R E T ...
- redis sentinel搭建以及在jedis中使用
一.redis主从搭建 1.搭建redis master 1>redis安装 mkdir -p /usr/local/webserver/redis //安装目录 cd /usr/local/w ...
- 阿里云服务器redis启动绑定ip 开放端口仍无法访问问题
今天使用云服务器其redis 始终无法访问.redis.conf 这个配置文件也是改了又改.最后发现 执行redis启动命令时没有带上配置文件.仍然使用默认配置. src/redis-server ...
- 如何在match中使用正则表达式
这是在实现搜索功能的时候遇到的一个问题,在搜索的场景中,会根据搜索框中输入的内容,匹配出包含搜索内容的部分.简单模拟还原使用场景: 首先定义一个遍历 value 用来接收输入的内容 var value ...
- 安装Chrome插件
重装系统后重装了Chrome浏览器,想着将自己的东西同步到Chrome上.但是登录谷歌账号要FQ,我又是靠setup插件FQ,但插件又要靠账号同步到本地.形成了死循环. 其实重装系统前我将插件提取了, ...
- Python数值
一.python数值类型 python数值类型有以下四种: int(整数) float(浮点数) complex(复数) bool(布尔型) 注意:python3取消了long型. 二.python ...
- npm run build打包后自定义动画没有执行
问题描述:在vue项目中,当你自己写了一些自定义动画效果,然后你npm run build打包项目放到线上环境后,发现动画并没有效果. 解决办法:在vue项目中找到build文件夹下的vue-load ...
- apache使用.htaccess文件中RewriteRule重定向后,URL中的加号无法解析
今天在使用.htaccess做伪静态的时候,发生一件怪事,URL里存在C++时会有问题,在处理C++这个词的时候,无论如何,$_GET都得不到++,只能得到C空格. 一开始我以为是没用urlencod ...
- JS 红包随机
微信随机红包,指定金额指定用户,随机发送红包 var moneys = new Array(); var moneyTotal = 0; function rand(obj){ if(obj.size ...
- Hue联合(hdfs yarn hive) 后续......................
1.启动hdfs,yarn start-all.sh 2.启动hive $ bin/hive $ bin/hive --service metastore & $ bin/hive --ser ...