采用DOM实现方式操作XML
1. 创建XML文件
//创建XML
QDomDocument doc;
//创建处理指令并将其添加到doc中
QDomProcessingInstruction instruction;
instruction = doc.createProcessingInstruction("xml",
"version=\"1.0\" encoding=\"UTF-8\"");
doc.appendChild(instruction);
2. 保存XML文件
//istrFileName为保存路径
QFile file(istrFileName);
if(!file.open(QIODevice::Truncate | QIODevice::WriteOnly))
{
QMessageBox::about(NULL, tr("错误"), tr("生成配置文件失败,请重试!"));
return;
}
QTextStream out(&file);
// 将文档保存到文件,4为子元素缩进字符数
doc.save(out, 4);
file.close();
3. 创建根元素
//创建根元素
QDomElement root= doc.createElement("GlassLayout");
doc.appendChild(root);
4. 创建带Text的子元素
//创建size子元素
QDomElement size = doc.createElement("Size");
//为子元素添加text
QDomText text = doc.createTextNode("12");
size.appendChild(text);
//将size子元素添加到根目录中
root.appendChild(size);
5. 创建带AttributeNode的子元素
//创建子元素
QDomElement layout = doc.createElement("Layout");
//创建子元素的属性节点
QDomAttr mainID = doc.createAttribute("mainID");
mainID.setValue(strValue);
layout.setAttributeNode(mainID);
//将子元素添加到root下
root.appendChild(layout);
6. 读取XML
QFile file(istrFileName);//打开xml文件
//若不存在,则提示
if(!file.exists())
{
QMessageBox::about(NULL, tr("提示"), tr("未发现配置文件"));
return;
}
//将文件内容打开到Qdoc,然后关闭文件
QDomDocument Qdoc;
if (!Qdoc.setContent(&file))
{
file.close();
return ;
}
file.close();
当为一个QDocElement设置两个或两个以上的AttributeNode时,Qdoc.setContent失败!
具体原因:待查找。
解决方案:
改为text即可
7. 读取element
//通过tagName来获取根节点或子节点
QDomNodeList nodeList = Qdoc.elementsByTagName("GlassLayout");
//获取根节点下的所有子节点
QDomNodeList child = nodeList.at(0).childNodes();
for(int i=0;i<child.count();++i)
{
QDomElement element = child.at(i).toElement();
cout<<i<<" "<<element.tagName().toStdString()<<endl;
//获取子节点的attribute信息
QDomNamedNodeMap eleMap = element.attributes();
for(int j=0; j<eleMap.count(); j++)
{
cout<<" "<<j<<" "<<eleMap.item(j).nodeName().toStdString()<<endl;
cout<<" "<<j<<" "<<eleMap.item(j).nodeValue().toStdString()<<endl;
}
//获取子节点的text信息
QString strtext = element.text();
}