C++、Qt分别读写xml文件的方法实例

2023-03-06 16:11:16
目录
XML语法C++使用tinyxml读写xmlQt读写xml总结 

XML语法

第一行是XML文档声明,<>内的代表是元素,基本语法如以下所示。C++常见的是使用tiny库读写,Qt使用自带的库读写;

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<根元素>
   <元素 属性名="属性值" 属性名="属性值">Text</元素>
   <元素 属性名="属性值" 属性名="属性值">
       <子元素>Text</子元素>
   </元素>
</根元素>

C++使用tinyxml读写xml

首先从网站下载tinyxml库,

将6个文件加载到自己的项目中:

写XML:

新建文件并写入:

#include "include/tinyxml.h"

string strPath = "E:/test.xml";
TiXmlDocument *writeDoc = new TiXmlDocument; //xml文档指针
//文档格式声明
TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "UTF-8", "yes");
writeDoc->LinkEndChild(decl); //写入文档
//TiXmlElement父类的析构函数内自带delete,所以不用自己释放
TiXmlElement *RootElement = new TiXmlElement("Camera");//根元素
RootElement->SetAttribute("num", "3"); //属性
writeDoc->LinkEndChild(RootElement);
TiXmlElement *StuElement = new TiXmlElement("Exposure");//Stu
//设置属性
StuElement->SetAttribute("time", "A");
StuElement->SetAttribute("deley", "30");
RootElement->LinkEndChild(StuElement);//父节点写入文档
//子元素
TiXmlElement *sonElement1 = new TiXmlElement("max");
StuElement->LinkEndChild(sonElement1);
TiXmlText *maxContent = new TiXmlText("1000");
sonElement1->LinkEndChild(maxContent);

TiXmlElement *sonElement2 = new TiXmlElement("min");
StuElement->LinkEndChild(sonElement2);
TiXmlText *minContent = new TiXmlText("80");
sonElement2->LinkEndChild(minContent);


writeDoc->SaveFile(strPath.c_str());
delete writeDoc;

最终生成的xml文件是:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Camera num="3">
    <Exposure time="A" deley="30">
        <max>1000</max>
        <min>80</min>
    </Exposure>
</Camera>

所以,使用tinyxml函数库中的类去读写根元素,text和属性。这里主要用到的就是四个类和三个函数:

<TiXmlDeclaration>
<TiXmlElement>
     <TiXmlElement>
        <TiXmlElement>TiXmlText</TiXmlElement>
     </TiXmlElement>
</TiXmlElement>

四个类:

    TiXmlDocument:定义一些基本的xml文件的基本操作,包含文件流;TiXmlDeclaration:用于xml文件的第一行,定义xml文件的声明操作;TiXmlElement:不管根元素,元素和子元素,都用此类;TiXmlText:用于元素内的text的操作;

    三个函数:

      LinkEndChild:将子元素嵌在父元素内,还可以将text加到元素内SetAttribute:设置元素内的属性名称与属性值SaveFile:用于保存xml文件;如果xml文件不存在,会自动创建一个;

      读XML:

      TiXmlDocument mydoc("E:/test.xml");
      if(!mydoc.LoadFile())
      {
         return;
      }
      TiXmlElement *RootElement = mydoc.RootElement();   //获取根元素
      //遍历根元素下的元素
      for(TiXmlElement *StuElement = RootElement->FirstChildElement();//第一个子元素
      		StuElement != NULL;
      		StuElement = StuElement->NextSiblingElement())//下一个兄弟元素
      {
              //先找到Exposure元素
      		if (0 == strcmp("Exposure", StuElement->Value()))
      		{
      			//遍历Exposure元素下的子元素
      			for (TiXmlElement *sonElement = StuElement->FirstChildElement();
      			     sonElement != NULL;
      				 sonElement = sonElement->NextSiblingElement())
      			{
      				//找到max元素,并输出元素内的text
      				if (0 == strcmp("max", sonElement->Value()))
      				{
      					string str = sonElement->GetText();
      					cout << str.c_str() << endl;
      				}
      			}
      		}
      }
      

      Qt读写xml

      写XML:

      //头文件
      #include <QDomDocument>
      QString fileName = "E:/test.xml";
      QFile file(fileName);
      if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate))
        return;
      //定义xml文件
      QDomDocument doc;
      //定义格式头
      QDomProcessingInstruction ins = doc.createProcessingInstruction("xml","version = \'1.0\' encoding = \'utf-8\'");
      //追加元素
      doc.appendChild(ins);
      //根节点元素
      QDomElement root = doc.createElement("Camera");
      doc.appendChild(root);
      //在根节点的基础上增加一个子节点
      QDomElement sonEmt = doc.createElement("Exposure");
      //创建元素的属性名
      QDomAttr sonAttr = doc.createAttribute("time");
      //创建元素的属性值
      sonAttr.setNodeValue("100");
      //节点和属性关联
      sonEmt.setAttributeNode(sonAttr);
      root.appendChild(sonEmt);
      //在根节点的基础上增加一个子节点,并设置子节点的text
      QDomElement sonOneEmt = doc.createElement("max");
      QDomText sonOneText = doc.createTextNode("1000");
      sonOneEmt.appendChild(sonOneText);
      sonEmt.appendChild(sonOneEmt);
      
      QDomElement sonTwoEmt = doc.createElement("min");
      QDomText sonTwoText = doc.createTextNode("80");
      sonTwoEmt.appendChild(sonTwoText);
      sonEmt.appendChild(sonTwoEmt);
      
      //写入文件
      QTextStream stream(&file);
      doc.save(stream,4);//4缩进
      

      这里对应的类有:

      <QDomProcessingInstruction>
      <QDomElement>
         <QDomElement>QDomText</QDomElement>
         <QDomElement QDomAttr>
         </QDomElement>
      </QDomElement>
      

      读XML:

      #include <QXmlStreamReader>
      
      QDomDocument doc;
      QString fileName = "E:/test.xml";
      QFile file(fileName);
      if(!file.open(QIODevice::ReadOnly|QIODevice::Truncate))
      {
          return;
      }
      else
      {
          //将文件内容读到doc中
          if(!doc.setContent(&file))
              file.close();
          //返回根元素
          QDomElement root = doc.documentElement();
          //返回根元素的名称
          QDomNode n = root.firstChild();
          while(!n.isNull())
          {
             if(n.isElement())
             {
               QDomElement e = n.toElement();
               QString strXML = qPrintable(e.tagName());
               //判断第一个节点
               if("Exposure" == strXML)
               {
                   //遍历寻找Exposure元素下的子元素,并找到其text
                   QDomNodeList list = e.childNodes();
                   for(int i=0;i<list.count();i++)
                   {
                      QDomNode node = list.at(i);
                      strXML = qPrintable(node.toElement().tagName());
                      //判断第二个元素
                      if(node.isElement() && "max"== strXML)
                        QString textStr = qPrintable(node.toElement().text());//读取子元素内的text
                   }
               }
             }
          }
      }
      

      界面读取的效果为:

      总结 

      到此这篇关于C++、Qt分别读写xml文件的文章就介绍到这了,更多相关C++>