C++之TinyXML的使用介绍 (一)

2014-11-23 23:18:21 · 作者: · 浏览: 10
.引子:
最近在做GBT28181国标平台对接的工作,涉及到一些进程间消息通讯,消息体有xml格式,之前测试的时候都是拿他们当做字符串去解析,现在正儿八经地开发的时候,就想到了用xml库去解析,由于之前在HW最后一个项目用到的xml库就是这个,所以这里延续使用它。总体来说还是比较好用的:
二.编译、使用:
Windows下使用方法:1.直接用其VS工程进行编译生成lib库,2.拷贝 源码到自己工程中使用。我这里选择了第二种,主要是以后想自己看看这块的源码,并且程序容易debug。
1. 将tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp拷贝到自己的工程里
2. 引入头文件tinystr.h、tinyxml.h
3.直接编译使用;
三.介绍:
在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的一些操作。
四.代码示例:
读xml:
void readXml() {  
    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; } } }
void writeXml() {  
    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", "feilong");  
    stu2Element->SetAttribute("number", "123");  
    TiXmlElement * stu2EmailElement = new TiXmlElement("email");  
    stu2EmailElement->LinkEndChild(new TiXmlText("feilongxx@gmail.com"));  
    TiXmlElement * stu2AddressElement = new TiXmlElement("address");  
    stu2AddressElement->LinkEndChild(new TiXmlText("中国"));  
    stu2Element->LinkEndChild(stu2EmailElement);  
    stu2Element->LinkEndChild(stu2AddressElement);  
  
    classElement->LinkEndChild(stu1Element);    
    classElement->LinkEndChild(stu2Element);    
    schoolElement->LinkEndChild(classEle