c++中用TINYXML解析XML文件
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中的申明部分,即<?versiong="1.0"?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分。
TiXmlUnknown:对应于XML的未知部分。
TiXmlHandler:定义了针对XML的一些操作。
下载和编译
下载地址:http://sourceforge.net/projects/tinyxml/
工作目录为:
tinyxml///工作目录 |--include//头文件根目录 ||--tinyxml//tinyxml头文件,包括tinystr.htinyxml.h |--src//cpp源码文件根目录 |--tinyxml//tinyxml源码文件夹,包括tinystr.cpptinyxml.cpptinyxmlerror.cpptinyxmlparser.cpp |--main.cpp//我们的主函数,调用tinyxml的示例代码 |--conf//我们示例中用的xml文件所在的文件夹 |--makefile//makefile,不用我们多说了吧,不懂请看我博客的makefile最佳实践
简单的例子
在conf目录下建立student.xml代码
tinyxml@163.com 中国jsoncpp@gmail.com 美国
想要使用tinyxml,只需要在头文件中包含
读取整个xml文件并打印代码:
voidprintSchoolXml(){
usingnamespacestd;
TiXmlDocumentdoc;
constchar*xmlFile="conf/school.xml";
if(doc.LoadFile(xmlFile)){
doc.Print();
}else{
cout<<"cannotparsexmlconf/school.xml"<
读取XML
voidreadSchoolXml(){
usingnamespacestd;
constchar*xmlFile="conf/school.xml";
TiXmlDocumentdoc;
if(doc.LoadFile(xmlFile)){
doc.Print();
}else{
cout<<"cannotparsexmlconf/school.xml"<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<Name()<<":"<Value()<FirstChildElement();//获得student的第一个联系方式
for(;studentContactElement!=NULL;studentContactElement=studentContactElement->NextSiblingElement()){
stringcontactType=studentContactElement->Value();
stringcontactValue=studentContactElement->GetText();
cout<
写入xml
voidwriteSchoolXml(){
usingnamespacestd;
constchar*xmlFile="conf/school-write.xml";
TiXmlDocumentdoc;
TiXmlDeclaration*decl=newTiXmlDeclaration("1.0","","");
TiXmlElement*schoolElement=newTiXmlElement("School");
TiXmlElement*classElement=newTiXmlElement("Class");
classElement->SetAttribute("name","C++");
TiXmlElement*stu1Element=newTiXmlElement("Student");
stu1Element->SetAttribute("name","tinyxml");
stu1Element->SetAttribute("number","123");
TiXmlElement*stu1EmailElement=newTiXmlElement("email");
stu1EmailElement->LinkEndChild(newTiXmlText("tinyxml@163.com"));
TiXmlElement*stu1AddressElement=newTiXmlElement("address");
stu1AddressElement->LinkEndChild(newTiXmlText("中国"));
stu1Element->LinkEndChild(stu1EmailElement);
stu1Element->LinkEndChild(stu1AddressElement);
TiXmlElement*stu2Element=newTiXmlElement("Student");
stu2Element->SetAttribute("name","jsoncpp");
stu2Element->SetAttribute("number","456");
TiXmlElement*stu2EmailElement=newTiXmlElement("email");
stu2EmailElement->LinkEndChild(newTiXmlText("jsoncpp@163.com"));
TiXmlElement*stu2AddressElement=newTiXmlElement("address");
stu2AddressElement->LinkEndChild(newTiXmlText("美国"));
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的基类
TiXmlNodenode;
node.Clear();
从A节点上移除子节点B
TiXmlNodenodeA;
nodeA.RemoveChild(TiXmlNode*removeThis);
从元素A上移除名字为B的属性
TiXmlAttributeattrA;
attrA.RemoveAttribute(constchar*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,constTiXmlNode&withThis);
以上就是c++中用TINYXML解析XML文件的详细内容,更多关于c++tinyxml解析XML的资料请关注毛票票其它相关文章!