Qt写xml文件

前端之家收集整理的这篇文章主要介绍了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关系就好。

猜你在找的XML相关文章