Qt读写XML文件
lw只吃亿点. 人气:0一、示例XML文件内容
下方为本文所使用的xml文件的内容
<?xml version="1.0" encoding="UTF-8"?> <root> <childNode1 attruKey="attriVal">childNode1 Val</childNode1> <childNode2 attruKey="attriVal"> <cChildNode1 shuxing1="1">cChildNode1 Val</cChildNode1> <cChildNode2 shuxing2="2">cChildNode2 Val</cChildNode2> </childNode2> </root>
二、XML文件的写入
下方为XML文件写入的源码,其中代码内容按顺序如下:
- QDomDocument对象的创建和xml文件头的添加
- 创建根节点
- 创建包含属性和节点值的子节点
- 创建较为复杂的子节点(包含属性和第三级节点)
- 写入文件
//创建QDomDocument对象 QDomDocument xDoc; QDomProcessingInstruction inStruction; //写入xml文件头(xml版本信息和编码信息) inStruction = xDoc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\""); xDoc.appendChild(inStruction); //创建根节点并将其添加到xDoc中 QDomElement root = xDoc.createElement("root"); xDoc.appendChild(root); //创建子节点1 QDomElement childNode1 = xDoc.createElement("childNode1"); //为子节点childNode1设置属性及属性值 childNode1.setAttribute("attruKey", "attriVal"); //! 为子节点childNode1添加节点值 //! 创建QDomText对象并设置其值 QDomText nodeVal = xDoc.createTextNode("childNode1 Val"); //使用QDomElement对象的节点,添加节点值需添加QDomText对象,否则有可能不显示该值 childNode1.appendChild(nodeVal); //将子节点1添加到根节点中 root.appendChild(childNode1); //! 创建一个多级节点childNode2 //创建多级节点2 QDomElement childNode2 = xDoc.createElement("childNode2"); //为多级节点childNode2设置属性及属性值 childNode2.setAttribute("attruKey", "attriVal"); //创建多级节点的子节点1 QDomElement cChildNode1 = xDoc.createElement("cChildNode1"); //设置cChildNode1的属性和值 cChildNode1.setAttribute("shuxing1", 1); //设置cChildNode1的节点值 cChildNode1.appendChild(xDoc.createTextNode("cChildNode1 Val")); //将cChildNode1节点添加到多级节点中 childNode2.appendChild(cChildNode1); //创建多级节点的子节点2 QDomElement cChildNode2 = xDoc.createElement("cChildNode2"); //设置cChildNode2的属性和值 cChildNode2.setAttribute("shuxing2", 2); //设置cChildNode2的节点值 cChildNode2.appendChild(xDoc.createTextNode("cChildNode2 Val")); //将cChildNode2节点添加到多级节点中 childNode2.appendChild(cChildNode2); //将多级节点childNode2添加到根节点中 root.appendChild(childNode2); //指定xml文件路径 QFile file("./xmlTest.xml"); //以只读方式打开,并且会清空文件内容 if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return 0; //使用文本流写入文件 QTextStream outputStream(&file); xDoc.save(outputStream, 4); //缩进四格 file.close();
三、XML文件的读取
3.1 文件读取源码
下方为XML文件读取的源码,其中代码内容按顺序如下:
- 创建QDomDocument对象并打开文件添加其数据源
- 获取根节点
- 读取较为简单的子节点(仅一个属性和节点值)
- 读取较为复杂的子节点(包含属性和不同的)
//创建QDomDocument对象 QDomDocument xDoc; //指定读取的xml文件路径 QFile file("./xmlTest.xml"); //xml文件以只读方式打卡 if (!file.open(QIODevice::ReadOnly)) return 0; //调用setContent函数设置数据源 if (!xDoc.setContent(&file)) { file.close(); return 0; } file.close(); //获取xDoc中的QDomElement对象 QDomElement docElem = xDoc.documentElement(); //获取docElem的根节点 QDomNode node = docElem.firstChild(); //!获取第一个子节点,并读取其属性及其值 QDomElement childNode1 = node.toElement(); //获取childNode1的属性值 QString attri1 = childNode1.attribute("attruKey"); //获取childNode1的节点值(既然设置节点值需要插入子节点,那么读取也应读取其子节点) QDomNode node1Child = childNode1.firstChild(); QString node1Val = node1Child.nodeValue(); //输出属性值和节点值 qDebug() << "第一个子节点的属性值和节点值"; qDebug() << attri1 << node1Val; //将节点移至下一节点的位置 node = node.nextSibling(); //! 获取第二个节点,并使用循环获取其中的各值 QDomElement childNode2 = node.toElement(); qDebug() << "第二节点的读取"; //获取childNode1的属性值 QString attri2 = childNode2.attribute("attruKey"); qDebug() << "第二节点的属性值:" << attri2; //获取第二节点中的第一子节点 QDomNode cChildNode = childNode2.firstChild(); while(!cChildNode.isNull()) { //获取当前子节点的对象 QDomElement e = cChildNode.toElement(); if(!e.isNull()) { qDebug() << e.firstChild().nodeValue(); // the node really is an element. } //获取下一节点元素 cChildNode = cChildNode.nextSibling(); }
3.2 读取结果示例
下方为XML文件读取输出示例
总结
XML文件使用QDomDocument对象写入和读取时需要注意如下事项,在写入时需要添加QDomText对象设置值;而在读取时需要读取其首个子节点,并获取其中的值。(越复杂的文件结构,需要更复杂的代码去读和写)
相关文章
加载全部内容