QtXml的读写

网上可以找到很多关于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();
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值