XML在C++下的编译与使用

材料:Window10+VS2015+tinyxml

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

①tinyxml下载

tinyxml官网下载链接
1.点击上方官网链接,进行下载,示例如下;在这里插入图片描述

②tinyxml编译

  • 1.将下载后的压缩包进行解压,得到tinyxml文件夹;
  • 2.考虑到tinyxml库很小,本文直接将必要文件拷贝到C++工程目录下使用,具体操作示例如下;
  • 3.在VS2015下,建立一个空的win32控制台工程,本文命名为XMLprocess;在附加包含目录中包含tinyxml文件夹;
    配置属性–》C/C++–》常规–》附加包含目录,选择tinyxml

在这里插入图片描述

  • 4.将tinyxml文件夹下的tinyxml.h,tinystr.h,tinyxml.cpp,tinystr.cpp,tinyxmlerror.cpp,tinyxmlparse.cpp,xmltest.cpp七个源码文件拷贝到XMLprocess工程目录下,并加载到程序里;
    在这里插入图片描述
  • 5.在程序中添加头文件tinyxml.h
    在这里插入图片描述
  • 6.常见问题解决方法;

(1)旧版本vs编写的tinyxml,用高版本打开需要升级,默认确定就行;
(2)xmltest.cpp报错;

  • a. 1142行代码缺少一个双引号 " ,加上就行了;
    在这里插入图片描述在这里插入图片描述
  • b. 1149行代码缺少一个双引号 " ,加上就行了;
    在这里插入图片描述在这里插入图片描述
  • c. 1153行代码 XmlTest,直接注释掉;
    在这里插入图片描述

③tinyxml类基本要素介绍

在TinyXML中,根据XML的各种元素来定义了一些类: TiXmlBase:整个TinyXML模型的基类。

TiXmlDocument:对应于XML的整个文档;
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong=“1.0” ?>;
TiXmlElement:对应于XML的元素;
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlText:对应于XML的文字部分;

TiXmlNode:对应于DOM结构中的节点;
TiXmlComment:对应于XML中的注释;
TiXmlUnknown:对应于XML的未知部分;
TiXmlHandler:定义了针对XML的一些操作。

③tinyxml的读写增删改

1.本文使用示例01.xml文件如下;

<School name="超神学院">
    
    <Class name = "C++">  
        
        <Student name="joe" number="00001">  
            <email>joe@edu.com</email>  
            <address>china</address>           
        </Student>  
        
        <Student name="tom" number="00002">  
            <email>tom@edu.com</email>  
            <address>america</address>           
        </Student>  
        
    </Class>  
    
</School>

2.读取整个xml文件并打印代码:

void printSchoolXml() {
    using namespace std;
    TiXmlDocument doc;  
    const char * xmlFile = "01.xml";   
    if (doc.LoadFile(xmlFile)) {    
        doc.Print();  
    } else {
        cout << "can not parse xml 01.xml" << endl;
    }   
}

3.读取整个xml文件内容:

void readSchoolXml() {
    using namespace std;
    const char * xmlFile = "01.xml";
    TiXmlDocument doc;                              
    if (doc.LoadFile(xmlFile)) {
        doc.Print();
    } else {
        cout << "can not parse xml 01.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;           
        }   
    } 
}

4.写入xml内容;

void writeSchoolXml() {
    using namespace std;
    const char * xmlFile = "01.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", "joe");
    stu1Element->SetAttribute("number", "00001");
    TiXmlElement * stu1EmailElement = new TiXmlElement("email");
    stu1EmailElement->LinkEndChild(new TiXmlText("joe@edu.com") );
    TiXmlElement * stu1AddressElement = new TiXmlElement("address");
    stu1AddressElement->LinkEndChild(new TiXmlText("china"));
    stu1Element->LinkEndChild(stu1EmailElement);
    stu1Element->LinkEndChild(stu1AddressElement);

    TiXmlElement * stu2Element = new TiXmlElement("Student");
    stu2Element->SetAttribute("name", "tom");
    stu2Element->SetAttribute("number", "00002");
    TiXmlElement * stu2EmailElement = new TiXmlElement("email");
    stu2EmailElement->LinkEndChild(new TiXmlText("tom@edu.com"));
    TiXmlElement * stu2AddressElement = new TiXmlElement("address");
    stu2AddressElement->LinkEndChild(new TiXmlText("america"));
    stu2Element->LinkEndChild(stu2EmailElement);
    stu2Element->LinkEndChild(stu2AddressElement);
  
    classElement->LinkEndChild(stu1Element);  
    classElement->LinkEndChild(stu2Element);  
    schoolElement->LinkEndChild(classElement);  
    
    doc.LinkEndChild(decl);  
    doc.LinkEndChild(schoolElement); 
    doc.SaveFile(xmlFile);  
}

5.xml的删除;
(1)删除某个节点, TiXmlNode是TiXmlElement、TiXmlComment、TiXmlText、TiXmlDeclaration、TiXmlUnknown\TiXmlDocument的基类;

TiXmlNode node;
node.Clear();

(2)从A节点上移除子节点B

TiXmlNode nodeA;
nodeA. RemoveChild( TiXmlNode* removeThis );

(3)从元素A上移除名字为B的属性

TiXmlAttribute attrA;
attrA. RemoveAttribute( const char * name );

6.xml的删除;
(1)查找内容为mfid val=“1234” / ,现需要将1234改成其他值;

TiXmlNode* lpnode = NULL;
lpnode = tixml.RootElement()->IterateChildren("mfid",lpnode);
TiXmlAttribute* tiattr = lpnode->ToElement()->FirstAttribute();
//找到mfid节点,获取第一个属性值。注意,如果有多个属性值,需要判断哪个属性值是需要的
tiattr->SetValue(mfid.c_str());

(2)替换一个节点;

TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值