微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Qt写xml文件

Qt有两种方式可以写xml文件,一是用QxmlStreamWriter。下面看看简单用法

void XmlHandle::writeXmlFileByStreamWriter()
{
	QString fileName = "book.xml";
	QFile file(fileName);
	if (!file.open(qiodevice::writeonly))
	{
		return;
	}
	QXmlStreamWriter writer(&file);
	writer.setCodec("UTF-8");
	writer.writeStartElement("Root");
	writer.writeStartElement("Book");
	writer.writeAttribute("Author","John");
	writer.writeTextElement("Name","C++ Programming");
	writer.writeTextElement("Price","99.5");
	writer.writeEndElement();
	writer.writeEndElement();
	file.close();
}

<?xml version="1.0"?>
-<Root>
-<Book Author="John">
<Name>C++ Programming</Name>
<Price>99.5</Price>
</Book>
</Root>

需要注意的几点:

  • 要记得调用writeEndElement(),嵌套了几层就要对应的调用writeEndElement()。因为调用writeStartElement()时,QXmlStreamWriter只产生打开标签,同时把标签名放入堆栈,只有你在调用writeEndElement()时才会从堆栈中弹出标签生成关闭标签
  • Xml中节点的顺序就是和节点在代码中出现的顺序是一样的。
  • Write….()方法一般会进行的检查,如果你的代码出现违反xml语法的操作,也会报错。

    比如你一不小心把代码的顺序搞错了:

    writer.writeTextElement("Name","C++Programming");

    writer.writeAttribute("Author","John");

    <Name>节点是不可能有Attribute的。


  • 如果不小心把代码写反了,是不会报错的。显然这样的xml不合法,因为没有根元素

    writer.writeEndElement();

    writer.writeEndElement();

    writer.writeTextElement("Price","99.5");


  • 所以,总的来说在用QXmlStreamWriter时要注意代码的顺序。



另外的方法就是用QDOMDocument类

void XmlHandle::writeXmlFileByDom()
{
	QFile file(m_xmlFilePath);
	if (!file.open(qiodevice::writeonly))
	{
		return;
	}
	QDomDocument xmlDocument;
	QDomElement RootElement = xmlDocument.createElement("Root");
	QDomElement personElement = xmlDocument.createElement("PerSon");
	xmlDocument.appendChild(RootElement);
	RootElement.appendChild(personElement);
	personElement.setAttribute("sex","man");
	QDomElement ageElement = xmlDocument.createElement("Age");
	QDomText ageText = xmlDocument.createTextNode("30");
	ageElement.appendChild(ageText);
	personElement.appendChild(ageElement);
	QDomElement nameElement = xmlDocument.createElement("Name");
	QDomText nameText = xmlDocument.createTextNode("Jack");
	nameElement.appendChild(nameText);

	personElement.appendChild(nameElement);

	QTextStream outStream(&file);
	outStream.setCodec("UTF-8");
	xmlDocument.save(outStream,3,QDomNode::EncodingFromTextStream);
	file.close();
}

<?xmlversion="1.0" encoding="UTF-8"?>
-<Root>
-<PerSon sex="man">
<Age>30</Age>
<Name>Jack</Name>
</PerSon>
</Root>

注意的点:
  • lQdomElementQdomTextQdomAttr等都是继承自QDOMNode。所有都带有

    appendChild方法。如果我们把

    nameElement.appendChild(nameText);

    写成了

    ageText.appendChild(nameText);

    结果是。程序并不发现这个错误生成的xml

    <?xmlversion="1.0" encoding="UTF-8"?>
    -<Root>
    -<PerSon sex="man">
    <Age>30</Age>
    <Name/>
    </PerSon>
    </Root>


  • 添加Attribute也可以用setAttributeNode()。

  • 不需要像QxmlStreamWriter一样注意顺序问题,只要理清节点的parent和child关系就好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。