TinyXML解析
阅读原文时间:2023年07月16日阅读:1

最近做一个负载均衡的小项目,需要解析xml配置文件,用到了TinyXML,感觉使用起来很容易,给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。

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的一些操作。

下载地址:http://sourceforge.net/projects/tinyxml/

工作目录为:

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代码

<Class name = "C++">  

    <Student name="tinyxml" number="123">  
        <email>tinyxml@163.com</email>  
        <address>中国</address>  
    </Student>  

    <Student name="jsoncpp" number="456">  
        <email>jsoncpp@gmail.com</email>  
        <address>美国</address>  
    </Student>  

</Class>  

想要使用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 );

【参考文章】:[https://www.cnblogs.com/ggjucheng/archive/2012/01/03/2311426.html]

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章