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>
注意的点:
-
lQdomElement,QdomText和QdomAttr等都是继承自QDOMNode。所有都带有
appendChild方法。如果我们把
nameElement.appendChild(nameText);
写成了
ageText.appendChild(nameText);
<?xmlversion="1.0" encoding="UTF-8"?> -<Root> -<PerSon sex="man"> <Age>30</Age> <Name/> </PerSon> </Root>
-
添加Attribute也可以用setAttributeNode()。
-
不需要像QxmlStreamWriter一样注意顺序问题,只要理清节点的parent和child关系就好。