加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Qt写xml文件

发布时间:2020-12-16 05:28:07 所属栏目:百科 来源:网络整理
导读:Qt有两种方式可以写xml文件,一是用QxmlStreamWriter。下面看看简单用法 void XmlHandle::writeXmlFileByStreamWriter(){QString fileName = "book.xml";QFile file(fileName);if (!file.open(QIODevice::WriteOnly)){return;}QXmlStreamWriter writer(file)

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关系就好。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读