-
tinyxml解析xml文件
2014-06-16 11:18:34vs2008写的例子 Unicode编码 实现把数据从数组结构体中写入xml,从xml文件中写入数组结构体。 内含一个说明文档里面有个简单的xml文件操作例子,和一个参考的网址链接。 用tinyxml类实现 -
tinyXml解析XML文件
2019-06-30 22:03:11TinyXML解析一个XML文档,并从该文档构建可读取、修改和保存的文档对象模型(DOM)。 XML代表“可扩展标记语言”,它允许您创建您自己的文档标记。HTML在标记方面做得很好用于浏览器的文档,XML允许您定义任何类型...TinyXML解析一个XML文档,并从该文档构建可读取、修改和保存的文档对象模型(DOM)。
XML代表“可扩展标记语言”,它允许您创建您自己的文档标记。HTML在标记方面做得很好用于浏览器的文档,XML允许您定义任何类型的文档标记,例如描述组织者应用程序。XML是一种非常结构化和方便的格式。所有为存储应用程序数据而创建的随机文件格式都可以全部替换为XML。所有内容都有一个解析器。
TinyXML设计为易于学习和快速学习。是两个.h和四个cpp文件。只需将这些添加到您的项目中就可以了。有一个示例文件xmltest.cpp可以让您开始。TinyXML是根据zlib许可证发布的,所以您可以在开放源码或商业代码中使用它。细节许可证在每个源文件的顶部。TinyXML试图成为一个灵活的解析器,但真正正确和兼容的XML输出。TinyXML应该编译任何合理的C++合规系统。它不依赖于异常或RTTI。它可以是使用或不使用STL支持编译。TinyXML完全支持UTF-8编码和前64K字符实体。
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
TinyXml中的各个基本类型之间的关系,看看这个继承图:
TinyXML的结构及节点说明:
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
在TinyXML中,根据XML的各种元素来定义了一些类:
TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分
TiXmlUnknown:对应于XML的未知部分。
TiXmlHandler:定义了针对XML的一些操作。
TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。
https://www.cnblogs.com/whlook/p/7117306.html
被解析的文件为test.xml,文件内容如下:
<?xml version="1.0" encoding="GBK" ?> <root> <host checked="true" station="1001">AAA</host> <client> <name>xiaoming</name> <id>200801</id> </client> </root>
解析该文件的C++程序如下:
#include <stdio.h> #include "../tinyxml/tinyxml.h" int main() { // 解析xml TiXmlDocument xml_doc; if(!xml_doc.LoadFile("test.xml")) { return -1; } // 根节点 TiXmlElement* xml_root = xml_doc.RootElement(); if (NULL == xml_root) { return -1; } // 获取元素的文本与属性 if(0) { TiXmlElement* xml_host = xml_root->FirstChildElement("host"); const char* text = xml_host->GetText(); const char* aChecked = xml_host->Attribute("checked"); const char* aStation = xml_host->Attribute("station"); printf("text:%s, check:%s, station:%s\n", text, aChecked, aStation); } // if(1) { TiXmlElement* xml_client = xml_root->FirstChildElement("client"); TiXmlElement* xml_clientId = xml_client->FirstChildElement("id"); TiXmlElement* xml_clientName = xml_client->FirstChildElement("name"); const char* text_name = xml_clientName->GetText(); printf("name = %s\n", text_name); // ...取得id和name的文本 ... } return 0; }
解析复杂XML例子:
https://blog.csdn.net/wcy6340/article/details/9670201
-
Tinyxml解析xml文件
2016-03-26 20:17:51读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用下载地址 http://sourceforge.net/projects/tinyxml/ 官网有详细的文档以及API介绍 感觉像javaXML解析文件一样好用。
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
在TinyXML中,根据XML的各种元素来定义了一些类:
TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分
TiXmlUnknown:对应于XML的未知部分。
TiXmlHandler:定义了针对XML的一些操作。
TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。
后解压缩TinyXML后,将这六个文件添加到你的c++工程中,分别是tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。
如本示例中,只有 main.cpp 才是测试代码:
编写代码时,只需要包含 tinyxml.h 头文件即可,但是,编译时却需要把所有.cpp 文件都加上。
示例代码如下:
12345#include <stdio.h>
#include "tinyxml.h"
#include <iostream>
#include <cstring>
using
namespace
std;
12345678910111213141516/*
TiXmlDocument:文档类,它代表了整个xml文件
TiXmlDeclaration:声明类,它表示文件的声明部分
TiXmlComment:注释类,它表示文件的注释部分
TiXmlElement:元素类,它是文件的主要部分,并且支持嵌套结构,一般使用这种结构来分类的存储信息,它可以包含属性类和文本类
TiXmlAttribute/TiXmlAttributeSet:元素属性,它一般嵌套在元素中,用于记录此元素的一些属性
TiXmlText:文本对象,它嵌套在某个元素内部
*/
//创建xml文件
int
writeXmlFile()
{
TiXmlDocument *writeDoc =
new
TiXmlDocument;
//xml文档指针
//文档格式声明
TiXmlDeclaration *decl =
new
TiXmlDeclaration(
"1.0"
,
"UTF-8"
,
"yes"
);
writeDoc->LinkEndChild(decl);
//写入文档
1int
n = 3;
//父节点个数
123456789101112131415161718192021TiXmlElement *RootElement =
new
TiXmlElement(
"Info"
);
//根元素
RootElement->SetAttribute(
"num"
, n);
//属性
writeDoc->LinkEndChild(RootElement);
for
(
int
i=0; i<n; i++)
//n个父节点
{
TiXmlElement *StuElement =
new
TiXmlElement(
"Stu"
);
//Stu
//设置属性
StuElement->SetAttribute(
"class"
,
"A"
);
if
(2 == i)
{
StuElement->SetAttribute(
"class"
,
"B"
);
}
StuElement->SetAttribute(
"id"
,i+1);
StuElement->SetAttribute(
"flag"
, (i+1)*10);
RootElement->LinkEndChild(StuElement);
//父节点写入文档
//姓名
TiXmlElement *nameElement =
new
TiXmlElement(
"name"
);
StuElement->LinkEndChild(nameElement);
123456TiXmlText *nameContent =
new
TiXmlText(
"mike"
);
nameElement->LinkEndChild(nameContent);
//分数
TiXmlElement *scoreElement =
new
TiXmlElement(
"score"
);
StuElement->LinkEndChild(scoreElement);
123456TiXmlText *scoreContent =
new
TiXmlText(
"88"
);
scoreElement->LinkEndChild(scoreContent);
//城市
TiXmlElement *cityElement =
new
TiXmlElement(
"city"
);
StuElement->LinkEndChild(cityElement);
12345678910TiXmlText *cityContent =
new
TiXmlText(
"Shenzhen"
);
cityElement->LinkEndChild(cityContent);
}
writeDoc->SaveFile(
"stu_info.xml"
);
delete
writeDoc;
return
1;
}
12345678910//解析xml文件
int
readXmlFile()
{
TiXmlDocument mydoc(
"stu_info.xml"
);
//xml文档对象
bool
loadOk=mydoc.LoadFile();
//加载文档
if
(!loadOk)
{
cout<<
"could not load the test file.Error:"
<<mydoc.ErrorDesc()<<endl;
exit
(1);
}
1234TiXmlElement *RootElement=mydoc.RootElement();
//根元素, Info
cout<<
"[root name]"
<< RootElement->Value() <<
"\n"
;
TiXmlElement *pEle=RootElement;
123456789101112131415161718192021222324252627//遍历该结点
for
(TiXmlElement *StuElement = pEle->FirstChildElement();
//第一个子元素
StuElement != NULL;
StuElement = StuElement->NextSiblingElement())
//下一个兄弟元素
{
// StuElement->Value() 节点名称
cout<< StuElement->Value() <<
" "
;
TiXmlAttribute *pAttr=StuElement->FirstAttribute();
//第一个属性
while
( NULL != pAttr)
//输出所有属性
{
cout<<pAttr->Name()<<
":"
<<pAttr->Value()<<
" "
;
pAttr=pAttr->Next();
}
cout<<endl;
//输出子元素的值
for
(TiXmlElement *sonElement=StuElement->FirstChildElement();
sonElement;
sonElement=sonElement->NextSiblingElement())
{
cout<<sonElement->FirstChild()->Value()<<endl;
}
}
return
1;
}
1234567int
main(
int
argc,
char
*argv[])
{
writeXmlFile();
printf
(
"\nafter write\n"
);
readXmlFile();
12return
0;
}
编译运行结果如下:
生成的xml文件内容如下:
1234567891011121314151617181920212223242526272829303132333435<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
standalone
=
"yes"
?>
<
Info
num
=
"3"
>
<
Stu
class
=
"A"
id
=
"1"
flag
=
"10"
>
<
name
>mike</
name
>
<
score
>88</
score
>
<
city
>Shenzhen</
city
>
</
Stu
>
<
Stu
class
=
"A"
id
=
"2"
flag
=
"20"
>
<
name
>mike</
name
>
<
score
>88</
score
>
<
city
>Shenzhen</
city
>
</
Stu
>
<
Stu
class
=
"B"
id
=
"3"
flag
=
"30"
>
<
name
>mike</
name
>
<
score
>88</
score
>
<
city
>Shenzhen</
city
>
</
Stu
>
</
Info
>
-
c++中用TINYXML解析XML文件
2020-08-19 02:53:37主要介绍了c++中如何用TINYXML解析XML文件,文中案例非常详细,帮助大家更好的了解和学习,感兴趣的朋友可以了解下 -
TinyXml解析xml文件Dll动态库.zip
2019-09-02 21:21:26软件介绍: TinyXml解析xml文件,本资源已经将TinyXml源码打包成Dll动态库,可直接调用,非常方便。TinyXml.dllTinyXml.libvcruntime140_app.dll -
C++ 使用TinyXML解析XML文件
2018-02-27 11:53:00 -
tinyxml 读取文本节点_c++中用TINYXML解析XML文件
2021-01-30 11:05:48TinyXML介绍最近做一个负载均衡的小项目,需要解析xml配置文件,用到了TinyXML,感觉使用起来很容易,给出一个使用Tiny...这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵...TinyXML介绍
最近做一个负载均衡的小项目,需要解析xml配置文件,用到了TinyXML,感觉使用起来很容易,给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
TinyXML类说明
在TinyXML中,根据XML的各种元素来定义了一些类:
TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释。
TiXmlDeclaration:对应于XML中的申明部分,即。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分。
TiXmlUnknown:对应于XML的未知部分。
TiXmlHandler:定义了针对XML的一些操作。
下载和编译
工作目录为:
tinyxml/ //工作目录
|-- include //头文件根目录
| |-- tinyxml //tinyxml头文件,包括tinystr.h tinyxml.h
|-- src //cpp源码文件根目录
|-- tinyxml //tinyxml源码文件夹,包括tinystr.cpp tinyxml.cpp tinyxmlerror.cpp tinyxmlparser.cpp
|-- main.cpp //我们的主函数,调用tinyxml的示例代码
|-- conf //我们示例中用的xml文件所在的文件夹
|-- makefile //makefile,不用我们多说了吧,不懂请看我博客的makefile最佳实践
简单的例子
在conf目录下建立student.xml代码
tinyxml@163.com
中国jsoncpp@gmail.com
美国想要使用tinyxml,只需要在头文件中包含即可
读取整个xml文件并打印代码:
void printSchoolXml() {
using namespace std;
TiXmlDocument doc;
const char * xmlFile = "conf/school.xml";
if (doc.LoadFile(xmlFile)) {
doc.Print();
} else {
cout << "can not parse xml conf/school.xml" << endl;
}
}
读取XML
void readSchoolXml() {
using namespace std;
const char * xmlFile = "conf/school.xml";
TiXmlDocument doc;
if (doc.LoadFile(xmlFile)) {
doc.Print();
} else {
cout << "can not parse xml conf/school.xml" << endl;
return;
}
TiXmlElement* rootElement = doc.RootElement(); //School元素
TiXmlElement* classElement = rootElement->FirstChildElement(); // Class元素
TiXmlElement* studentElement = classElement->FirstChildElement(); //Students
for (; studentElement != NULL; studentElement = studentElement->NextSiblingElement() ) {
TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute(); //获得student的name属性
for (;attributeOfStudent != NULL; attributeOfStudent = attributeOfStudent->Next() ) {
cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;
}
TiXmlElement* studentContactElement = studentElement->FirstChildElement();//获得student的第一个联系方式
for (; studentContactElement != NULL; studentContactElement = studentContactElement->NextSiblingElement() ) {
string contactType = studentContactElement->Value();
string contactValue = studentContactElement->GetText();
cout << contactType << " : " << contactValue << std::endl;
}
}
}
写入xml
void writeSchoolXml() {
using namespace std;
const char * xmlFile = "conf/school-write.xml";
TiXmlDocument doc;
TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", "");
TiXmlElement * schoolElement = new TiXmlElement( "School" );
TiXmlElement * classElement = new TiXmlElement( "Class" );
classElement->SetAttribute("name", "C++");
TiXmlElement * stu1Element = new TiXmlElement("Student");
stu1Element->SetAttribute("name", "tinyxml");
stu1Element->SetAttribute("number", "123");
TiXmlElement * stu1EmailElement = new TiXmlElement("email");
stu1EmailElement->LinkEndChild(new TiXmlText("tinyxml@163.com") );
TiXmlElement * stu1AddressElement = new TiXmlElement("address");
stu1AddressElement->LinkEndChild(new TiXmlText("中国"));
stu1Element->LinkEndChild(stu1EmailElement);
stu1Element->LinkEndChild(stu1AddressElement);
TiXmlElement * stu2Element = new TiXmlElement("Student");
stu2Element->SetAttribute("name", "jsoncpp");
stu2Element->SetAttribute("number", "456");
TiXmlElement * stu2EmailElement = new TiXmlElement("email");
stu2EmailElement->LinkEndChild(new TiXmlText("jsoncpp@163.com"));
TiXmlElement * stu2AddressElement = new TiXmlElement("address");
stu2AddressElement->LinkEndChild(new TiXmlText("美国"));
stu2Element->LinkEndChild(stu2EmailElement);
stu2Element->LinkEndChild(stu2AddressElement);
classElement->LinkEndChild(stu1Element);
classElement->LinkEndChild(stu2Element);
schoolElement->LinkEndChild(classElement);
doc.LinkEndChild(decl);
doc.LinkEndChild(schoolElement);
doc.SaveFile(xmlFile);
}
XML删除操作
删除某个节点, TiXmlNode是TiXmlElement、TiXmlComment、TiXmlText、TiXmlDeclaration、TiXmlUnknown、
TiXmlDocument的基类
TiXmlNode node;
node.Clear();
从A节点上移除子节点B
TiXmlNode nodeA;
nodeA. RemoveChild( TiXmlNode* removeThis );
从元素A上移除名字为B的属性
TiXmlAttribute attrA;
attrA. RemoveAttribute( const char * name );
XML修改操作
查找内容为现需要将1234改成其他值
TiXmlNode* lpnode = NULL;
lpnode = tixml.RootElement()->IterateChildren("mfid",lpnode);
TiXmlAttribute* tiattr = lpnode->ToElement()->FirstAttribute();
//找到mfid节点,获取第一个属性值。注意,如果有多个属性值,需要判断哪个属性值是需要的
tiattr->SetValue(mfid.c_str());
替换一个节点
TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
以上就是c++中用TINYXML解析XML文件的详细内容,更多关于c++ tinyxml解析XML的资料请关注脚本之家其它相关文章!
-
使用TinyXML解析XML文件
2017-12-27 00:00:00这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 下载TinyXML的网址:http://www.grinninglizard.com/tinyxml/使用TinyXML只需要将其中的6个文件拷贝到项目中就 -
Android中,在C++层使用TinyXML解析XML文件
2018-06-18 09:47:51Android中,在C++层使用TinyXML解析XML文件 在Android开发之向您的项目添加C/C++代码这篇文章中说了在Andoid中使用C++的有点,以及如何在Java与C++建立通信。有兴趣的读者朋友可以参考上一篇文章。这篇文章我们讲,... -
使用tinyxml解析xml文件
2018-09-16 15:21:47下载地址 tinyxml下载链接https://download.csdn.net/download/u013230291/9920039 ...使用tinyxml需包含头文件#include “tinyxml.h” ... ///定义xml文件对象 oXmlFile.LoadFile(str_xml.c_str());///将x... -
C++ 使用 TinyXml 解析 XML 文件
2017-12-02 19:00:01这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序... -
在c++ 中使用tinyxml解析xml文件
2019-05-20 18:33:17读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它...这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 ... -
Cocos2d-x] 使用TinyXml 解析XML文件
2013-12-13 11:00:03Cocos2d-x] 使用TinyXml 解析XML文件 分类: Cocos2d-X2013-06-01 17:02843人阅读评论(0)收藏举报 在做开发的时候,经常会使用XML的情况,在使用XML的时候,很多情况下会解析XML,那么我们来看一下在... -
使用TinyXml 解析XML文件
2013-08-19 15:29:34在做开发的时候,经常会使用XML的情况,在使用XML的时候,很多情况下会解析XML,那么我们来看一下在cocos2d-x中如何使用TinnyXML来解析XML文件获取到我们需要的数据! 废话不多说,先看看例子XML的格式和... -
Linux下C++使用TinyXML解析XML文件
2012-03-19 19:22:40最近的由于项目需要解析XML文件,偷懒在网上找了一下开源的解析XML的源码学习了一下。发现一个上手很快,简单的开源解析XML的项目TinyXML。 TinyXML可以解析UTF-8编码格式的DOM标准的XML文件。他不能够解析DTDs ... -
QT5下vs2013中利用tinyXML解析XML文件
2016-10-21 19:04:141.下载tinyXML,解压; 2.复制tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp到工程目录中; 3.再要调用tinyXML类的文件中#include...4.XML文件示例: Persons>