通过项目的开发,我发现xml的读写主要是分为以下几种类型:
一种类型是:

<?xml version="1.0" encoding="UTF-8"?>
<POIS><POI LightMode="head_light" ShowUnderground="true" name="位置1 经度:89.9998 纬度:0"/>
</POIS>

这种情况是只有一个根节点,下来就是相同的子节点;对于这种情况,xml的读写是下面这样子的:

    //xml文件在电脑中放置的路径QString xmlPath = FileUtils::getInstance()->getConfigPath("./xmls/PoiPoints.xml");//根节点的加载QDomDocument dom;//加载xml文件QFile xmlFile(xmlPath);//判断xml是否打开if (!xmlFile.open(QIODevice::ReadOnly)){LOG_FAILD(L"open file initiative poi failed.");xmlFile.close();return;}//判断xml设置文件名if (!dom.setContent(&xmlFile)){LOG_FAILD(L"read initiative poi as xml content failed.");xmlFile.close();return;}//xml文件的关闭,这步必须得有,如果没有,读取xml是不起作用的xmlFile.close();//读取xml的根节点(相对于本实例就是POIS)QDomElement root=dom.documentElement();//读取根节点的子节点(相对于本实例就是POI)QDomElement element =root.firstChildElement();QString name, lightMode, showUnderground;bool bShowUnderground = false;POIType* poiType;//循环读取根节点的子节点while (true){//这步是必须的if (element.isNull()) break;//通过子节点的名字来判断子节点里面的元素if (element.tagName().compare("POI", Qt::CaseInsensitive) == 0){name = element.attribute("name");lightMode = element.attribute("LightMode");showUnderground = element.attribute("ShowUnderground", "false");bShowUnderground = showUnderground.compare("true", Qt::CaseInsensitive) == 0;poiType = new POIType(name, lightMode, bShowUnderground);}//hashPOI是一个哈希表hashPOI.insert(name, poiType);//进行下一个子节点,这步也是必须的element = element.nextSiblingElement();}

一种类型是:

<?xml version="1.0" encoding="utf-8"?>
<DataModel><ObjectType Name="GDJT_SB" Header="设备" Caption="设备" Table="GDJT_SB" Icon="Ventilator" InfoLogoIcon="INFO_SB"><Field Name="ID" Header="标识" Caption ="" Column="" DataType="" SystemType="Id" PresentType="VisibleInDetail" OrderByType="Asc1" Editor="IDEditor" EditorParams=""/><Field Name="ID_3D" Header="场景ID" Caption ="" Column="" DataType="" SystemType="ID_3D" PresentType="VisibleInDetail"/></ObjectType><ObjectType Name="GDJT_WXJL" Header="维修记录" Caption="" Table="GDJT_WXJL" Icon="Clear" InfoLogoIcon=""><Field Name="ID" Header="标识" Caption ="" Column="" DataType="" SystemType="Id" PresentType="VisibleInDetail" OrderByType="Asc1" Editor="IDEditor" EditorParams=""/><Field Name="BH" Header="编号" Caption ="" Column="" DataType="" SystemType="Name" PresentType=""/></ObjectType></DataModel>

这种情况是有一个根节点,有几个并列的根节点下面的子节点,还有几个根节点下面子节点的子节点,对于这种xml的读取,读取的方法是:

    //获取xml所在的文件夹的路径QString xmlDir = FileUtils::getInstance()->getConfigPath("Xmls/TypedMetaDatas");//读取xml所在的文件夹QDir dir(xmlDir);//获取xml所在的路径QString xmlFilePath = xmlDir + QDir::separator() + xmlFilePath;//获取xml文件QDomDocument dom;//加载xml的文件路径QFile xmlFile(xmlPath);//判断xml是否打开if (!xmlFile.open(QIODevice::ReadOnly)){xmlFile.close();return;}//判断xml的目录if (!dom.setContent(&xmlFile)) return;//xml文件的关闭,这步必须得有,如果没有,读取xml是不起作用的xmlFile.close();//读取xml的根节点(相对于本实例就是DataModel)QDomElement root=dom.documentElement();//读取根节点的子节点(相对于本实例就是ObjectType)QDomElement objectTypeElement =root.firstChildElement();QString name, header, caption, table, icon, logoIcon, column, dataType, systemType, presentType,preferWidth, orderByType,editor,editorParams,classifyType,defaultClassify;//循环读取根节点的子节点while (true){//这步是必须的if (objectTypeElement.isNull()) break;//获取objectType节点中的name属性name = objectTypeElement.attribute("Name");if (!name.isEmpty()){header = objectTypeElement.attribute("Header", name);caption = objectTypeElement.attribute("Caption", header);table = objectTypeElement.attribute("Table",name);if (table.isNull() || table.isEmpty()){table = name;}icon = objectTypeElement.attribute("Icon");logoIcon = objectTypeElement.attribute("InfoLogoIcon");//获取objectType下面的子节点(本实例中就是Field)QDomElement fieldElement = objectTypeElement.firstChildElement();while (true){if (fieldElement.isNull()) break;if (fieldElement.tagName() == "Field"){name = fieldElement.attribute("Name");header = fieldElement.attribute("Header", name);caption = fieldElement.attribute("Caption", header);column = fieldElement.attribute("Column", name);dataType = fieldElement.attribute("DataType", "String");systemType = fieldElement.attribute("SystemType", "Custom");presentType = fieldElement.attribute("PresentType", "VisibleInDetail | EditNone");preferWidth = fieldElement.attribute("PreferWidth");orderByType = fieldElement.attribute("OrderByType", "None");editor = fieldElement.attribute("Editor");editorParams = fieldElement.attribute("EditorParams");classifyType = fieldElement.attribute("ClassifyType");defaultClassify = fieldElement.attribute("DefaultClassify");}fieldElement = fieldElement.nextSiblingElement();}}objectTypeElement = objectTypeElement.nextSiblingElement();}
********************************************************************************

xml的写入,也可以分为几种情况:
一种情况:

<?xml version="1.0" encoding="UTF-8"?>
<POIS><POI LightMode="head_light" ShowUnderground="true" name="位置1 经度:89.9998 纬度:0"/>
</POIS>

这是一个根节点,一个子节点,这种xml的写入的写法为:

    QString xmlPath = FileUtils::getInstance()->getConfigPath("./xmls/PoiPoints.xml");QDomDocument dom;QFile xmlFile(xmlPath);if (!xmlFile.open(QIODevice::ReadOnly)){LOG_FAILD(L"open file initiative nav failed.");xmlFile.close();return;}if (!dom.setContent(&xmlFile)){LOG_FAILD(L"read initiative nav as xml content failed.");xmlFile.close();return;}xmlFile.close();QDomProcessingInstruction instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");dom.appendChild(instruction);QDomElement root = dom.createElement("POIS");dom.appendChild(root);QDomElment node=root.createElement("POI");root.appendChild(node);root.setAttribute("name", "位置1 经度:89.9998 纬度:0");root.setAttribute("LightMode", lightMode);root.setAttribute("ShowUnderground", ShowUnderground);QFile file("PoiPoints.xml");//以下几步很重要,在写入之后一定要保存,不然xml的写入不起作用if (!filexml.open(QFile::WriteOnly | QFile::Truncate)) return;QTextStream ts(&filexml);ts.reset();ts.setCodec("utf-8");dom.save(ts, 4, QDomNode::EncodingFromTextStream);filexml.close();

一种情况是:

<?xml version="1.0" encoding="UTF-8"?>
<POIS><POI><ShowUnderground>"true"</ShowUnderground><LightMode>"head_light"</LightMode><name>"位置1 经度:89.9998 纬度:0"</name></POI>
</POIS>

这是一个根节点,一个根节点下面有一个子节点,一个子节点下面有很多子节点:

QString xmlPath = FileUtils::getInstance()->getConfigPath("./xmls/PoiPoints.xml");QDomDocument dom;QFile xmlFile(xmlPath);if (!xmlFile.open(QIODevice::ReadOnly)){LOG_FAILD(L"open file initiative nav failed.");xmlFile.close();return;}if (!dom.setContent(&xmlFile)){LOG_FAILD(L"read initiative nav as xml content failed.");xmlFile.close();return;}xmlFile.close();QDomProcessingInstruction instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");dom.appendChild(instruction);QDomElement root = dom.createElement("POIS");dom.appendChild(root);QDomElment node=root.createElement("POI");root.appendChild(node);QDomElement nameNode=dom.createElement("name");node.appendChild(nameNode);QDomText nameText=dom.createTextNode("位置1 经度:89.9998 纬度:0");QFile file("PoiPoints.xml");//以下几步很重要,在写入之后一定要保存,不然xml的写入不起作用if (!filexml.open(QFile::WriteOnly | QFile::Truncate)) return;QTextStream ts(&filexml);ts.reset();ts.setCodec("utf-8");dom.save(ts, 4, QDomNode::EncodingFromTextStream);filexml.close();

qt中关于xml的读取、写入、修改等操作相关推荐

  1. php csv文件的读取,写入,输出下载操作详解

    2019独角兽企业重金招聘Python工程师标准>>> php对csv文件的读取,写入,输出下载操作. 代码: <?php $file = fopen('text.csv',' ...

  2. Qt中使用html语言对word进行图表操作

    参考文献: http://www.cnblogs.com/softwaretesting/archive/2011/07/29/2121593.html http://www.2cto.com/kf/ ...

  3. Qt中使用QAxObject的dynamicCall和querySubObject函数操作SolidWorks的方法

    大部分函数可以直接从VB语言"翻译"过去成为Qt中的C++语言,如 Set Part = swApp.OpenDoc6(strFilePath & "\" ...

  4. QT中使用GDAL多线程读取遥感图像到QImage

    GDAL 是一个很强大的可以读取很多格式 的带有GIS信息的栅格型图像.前阵子项目中需要读取遥感图像,并显示到QT界面,由于遥感图像一般很大,所以采取新开一个读图线程的方式来读取,防止界面假死.下面是 ...

  5. C# xml文件读取与修改

    c#读写xml文件 已知有一个XML文件(bookstore.xml)如下: Code<?xml version="1.0" encoding="gb2312&qu ...

  6. windows卸载qt_在Qt中,如何使用QSettings创建/修改/删除Windows注册表项/值?

    我想让我的Qt应用程序访问Windows注册表. 我做了一些研究,认为QSettings可能是要走的路. 假设我要将密钥/值放在这里:" HKEY_LOCAL_MACHINE SOFTWAR ...

  7. php中下载csv文件怎么打开,php对csv文件的读取,写入,输出下载操作详解

    搜索热词 代码如下: PHP $file = fopen('text.csv','r'); while ($data = fgetcsv($file)) { //每次读取CSV里面的一行内容 //pr ...

  8. python中csv文件的创建、读取、修改等操作总结

    1. python中创建新的csv文件 (1). 使用csv.writer()创建: 代码如下: import csvheaders = ['学号','姓名','分数'] rows = [('2020 ...

  9. Java IO流读取/写入/修改某个字符串(通用)

    2019独角兽企业重金招聘Python工程师标准>>> package com.test;import java.io.BufferedReader; import java.io. ...

最新文章

  1. 80后博导当上双一流高校副校长:还是杰青获得者
  2. 好好说一说室内定位技术
  3. tem在c语言中的作用,Temtem状态有什么效果 Temtem各状态效果介绍_游侠网
  4. Navicat Premium 11 12 闪退
  5. presto集群安装
  6. Mysql 学习之 SQL的执行顺序
  7. Doker : Docker 容器与宿主机共享文件
  8. Python+pandas+matplotlib可视化案例一则
  9. Android--Pin流程,飞行模式相关流程总结【工作日记一】
  10. android 执行Shell命令
  11. 薄板开孔建模计算的ansys命令流
  12. 两个实用的C语言工具———编程学习必备篇
  13. Volatility FAQ
  14. 安卓巴士精选Android开发教程
  15. 请简述SSM框架整合思路。
  16. redis中的increment()方法遇到的问题记录
  17. 机器学习中的数学基础(一):高等数学
  18. HMS Core华为分析丨受众细分,多场景促进精益运营
  19. java 虚拟机 Java内存结构 JVM垃圾回收机制算法
  20. VII html+css

热门文章

  1. 用 FileReader 对象 读取Excel表格并渲染
  2. python十进制小数转二进制_在python中如何将十进制小数转换成二进制
  3. 《精通特征工程》学习笔记(6):非线性特征化与k-均值模型堆叠
  4. 搜索图标那些优点和缺点列表
  5. centos忘记root密码怎么办
  6. New Audio Codec (4) : Daryl Ning 的 Warped LPC and Wavelet Audio Coding 方案
  7. 恒流电源与恒压电源在LED驱动应用上的分析。
  8. 如何在win10或win7下安装和运行debug
  9. 直播平台搭建的主要方式和开发细节
  10. 一对一直播平台搭建,选择直播系统源码,这几点不容忽视