QT xml格式操作
2021-09-10 本文已影响0人
c之气三段
QT += core xml
写xml
//打开或创建文件
QFile file("C:/Users/xxx/Desktop/text.xml"); //相对路径、绝对路径、资源路径都可以
if(!file.open(QFile::WriteOnly|QFile::Truncate)) //可以用QIODevice,Truncate表示清空原来的内容
return;
QDomDocument xmlDoc;
//写入xml头部
QDomProcessingInstruction instruction; //添加处理命令
instruction=xmlDoc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
xmlDoc.appendChild(instruction);
//添加根节点
QDomElement root=xmlDoc.createElement("paras");
xmlDoc.appendChild(root);
//添加第一个子节点即标签
QDomElement firstNode = xmlDoc.createElement("para");
firstNode.setAttribute("id",1); //方式一:创建属性 其中键值对的值可以是各种类型
QDomAttr time = xmlDoc.createAttribute("time"); //方式二:创建属性 值必须是字符串
time.setValue("2013/6/13");
firstNode.setAttributeNode(time);
QDomElement lable_1 = xmlDoc.createElement("value"); //创建子标签
QDomText text; //设置括号标签中间的值
text = xmlDoc.createTextNode("20");
firstNode.appendChild(lable_1);
lable_1.appendChild(text);
QDomElement lable_2 = xmlDoc.createElement("value"); //创建子标签
text = xmlDoc.createTextNode("30");
lable_2.appendChild(text);
firstNode.appendChild(lable_2);
root.appendChild(firstNode);
//添加第二个子节点及其子标签,部分变量只需重新赋值
QDomElement secondNode = xmlDoc.createElement("para");
secondNode.setAttribute("name","qt5");
secondNode.setAttribute("id",2);
secondNode.setAttribute("type","float");
QDomElement leble_scon_1 = xmlDoc.createElement("selection");
leble_scon_1.setAttribute("name","qchart");
QDomText selec_text = xmlDoc.createTextNode("30.2");
leble_scon_1.appendChild(selec_text);
secondNode.appendChild(leble_scon_1);
root.appendChild(secondNode);
//输出到文件
QTextStream out_stream(&file);
xmlDoc.save(out_stream,4); //缩进4格
file.close();
image.png
读xml,可以通过遍历获取到任意数据,也可进行数据更新
//打开或创建文件
QFile file("C:/Users/xxx/Desktop/text.xml"); //相对路径、绝对路径、资源路径都行不过需要重写一下
if(!file.open(QFile::ReadOnly))
return;
QDomDocument xmlDoc;
if(!xmlDoc.setContent(&file))
{
file.close();
return;
}
file.close();
QDomElement root=xmlDoc.documentElement(); //返回根节点
QDomNode node=root.firstChild(); //获得第一个子节点
while(!node.isNull()) //如果节点不空
{
if(node.isElement()) //如果节点是标签吗
{
//父节点
QDomElement leble=node.toElement(); //获取此标签
QString paraName = leble.tagName();//标签
QString attribute;//属性
QDomNamedNodeMap nodeMap = leble.attributes();//遍历所有属性顺序是乱序的,也可以按属性名获取值
for (int i = 0; i < nodeMap.size(); ++i)
{
attribute.append(nodeMap.item(i).nodeName()).append(":").append(nodeMap.item(i).nodeValue()).append(" ");
}
qDebug()<<paraName.append(" ").append(attribute);
//子节点
QDomNodeList list=leble.childNodes();
for(int i=0;i<list.count();i++)
{
QDomNode childNode=list.at(i);
if(childNode.isElement())
{
QDomElement childLeble=childNode.toElement();
QString vlueName = childLeble.tagName();//子标签名
QString attribute;//属性
QString text;//标签包的内容
QDomNamedNodeMap childLebleMap = childLeble.attributes();//遍历所有属性顺序是乱序的,也可以按属性名获取值
for (int i = 0; i < childLebleMap.size(); ++i)
{
attribute.append(childLebleMap.item(i).nodeName()).append(":").append(childLebleMap.item(i).nodeValue()).append(" ");
}
text = childNode.toElement().text();
qDebug()<<vlueName.append(" ").append(attribute).append(" ").append(text);
}
}
}
node=node.nextSibling(); //下一个兄弟节点,nextSiblingElement()是下一个兄弟元素,都差不多
}
image.png