网上可以找到很多关于QtXml读写的文章,但总感觉不够直接和具体,因此本文把自己写的一个简单的QtXml读写程序发上来,留作参考。
(1)写QtXml
void writeXml()
{
//DomDocument类代表整个的XML文件。概念上讲:它是文档树的根节点,并提供了文档数据的基本访问方法。
QDomDocument doc;
QDomProcessingInstruction instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
doc.appendChild(instruction);
QDomElement root,element,AttrNodes;
QDomText tempText;
//注意!这个root是doc的唯一子节点,其他子节点加在root的子节点集。必须加这个root,否则创建出的xml文件将无法被读出。
root = doc.createElement("TheRoot");
root.setAttribute("version", "TheRoot");
doc.appendChild(root);
//普通子节点
element = doc.createElement("Node1");
root.appendChild(element);
tempText = doc.createTextNode(QString::number(1));
element.appendChild(tempText);
element = doc.createElement("Node2");
root.appendChild(element);
tempText = doc.createTextNode(QString::number(2));
element.appendChild(tempText);
//如果子节点的内容有多项,可以用这种加很多标签的方式
AttrNodes = doc.createElement("AttrNodes");
root.appendChild(AttrNodes);
QDomAttr Attr1,Attr2,Attr3;
for (int i=0;i < 5;i++)
{
element = doc.createElement("NodeMessage");
Attr1 = doc.createAttribute("Attr1");
Attr1.setValue("info1");
Attr2 = doc.createAttribute("Attr1");
Attr2.setValue("info1");
Attr3 = doc.createAttribute("Attr1");
Attr3.setValue("info1");
element.setAttributeNode(Attr1);
element.setAttributeNode(Attr2);
element.setAttributeNode(Attr3);
AttrNodes.appendChild(element);
}
//创建以日期为名称的Xml文件,放在Xmls文件夹
QString fileName;
fileName = "Xmls//" + QDateTime::currentDateTime().toString("yyyy-MM-dd hh-mm-ss") + ".xml";
QFile file(fileName);
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
return;
}
QTextStream out(&file);
out.setCodec("UTF-8");
doc.save(out,4,QDomNode::EncodingFromTextStream);
}
写出的Xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<TheRoot version="TheRoot">
<Node1>1</Node1>
<Node2>2</Node2>
<AttrNodes>
<NodeMessage Attr1="info1" Attr1="info1" Attr1="info1"/>
<NodeMessage Attr1="info1" Attr1="info1" Attr1="info1"/>
<NodeMessage Attr1="info1" Attr1="info1" Attr1="info1"/>
<NodeMessage Attr1="info1" Attr1="info1" Attr1="info1"/>
<NodeMessage Attr1="info1" Attr1="info1" Attr1="info1"/>
</AttrNodes>
</TheRoot>
(2)读Xml
void readXml()
{
QDir binDir;
QString fileName = QFileDialog::getOpenFileName(mainFrame,
"打开任务文件", binDir.absolutePath(), "XML Files (*.XML *.xml)");
if (fileName.isEmpty())
return;
if (fileName.right(3).toUpper() != "XML")
return;
QFile file(fileName);
if (!file.open(QFile::ReadOnly | QFile::Text))
return;
QDomDocument doc; //如果前面没加root这里就无法读出file的内容
if (!doc.setContent(&file))
return;
QDomElement root = doc.documentElement();
QDomNode node,element;
node = root.firstChild();
while (!node.isNull())
{
if (node.toElement().tagName() == "Node1")
int n1 = node.toElement().text().toInt();
if (node.toElement().tagName() == "Node2")
int n2 = node.toElement().text().toInt();
int i=0;
QString tempStr;
if (node.toElement().tagName() == "AttrNodes")
{
while(!node.childNodes().at(i).isNull())
{
element = node.childNodes().at(i++);
tempStr = element.toElement().attribute("Attr1");
tempStr = element.toElement().attribute("Attr2");
tempStr = element.toElement().attribute("Attr3");
}
}
node = node.nextSiblingElement();
}
}