在C++及Qt中,读写XML文件是一项常见的任务。下面分别介绍C++和Qt中读写XML的方法及其实现,包括如何使用第三方库、如何解析XML文件的基本组成部分。
C++中读写XML文件
C++中可以使用第三方库TinyXML来读写XML文件。下面介绍如何使用TinyXML进行XML文件读写。
1、创建XML文件
要写入XML文件,首先需要文件句柄。然后创建XML节点和子节点,并将它们插入到文件中。代码如下:
#include "tinyxml.h"
int main()
{
TiXmlDocument doc;
TiXmlDeclaration *pDeclaration = new TiXmlDeclaration("1.0", "utf-8", "yes");
TiXmlElement *pRootElement = new TiXmlElement("Root");
doc.LinkEndChild(pDeclaration);
doc.LinkEndChild(pRootElement);
// 创建第一个子节点
TiXmlElement *pElement = new TiXmlElement("ChildNode1");
pElement->LinkEndChild(new TiXmlText("Content of the ChildNode1 tag"));
pRootElement->LinkEndChild(pElement);
// 创建第二个子节点
pElement = new TiXmlElement("ChildNode2");
pElement->SetAttribute("attribute", "the attribute value");
pElement->LinkEndChild(new TiXmlText("Content of the ChildNode2 tag"));
pRootElement->LinkEndChild(pElement);
doc.SaveFile("new_file.xml"); // 保存XML文件
return 0;
}
可以看到,这里首先创建了一个XML文档对象doc,并在其中添加了声明节点和根节点pRootElement。然后,我们创建了两个子节点pElement1和pElement2,并使用LinkEndChild方法将它们添加到根节点pRootElement中。pElement1没有额外的属性,所以只需要添加一个text子节点。pElement2有一个名为“attribute”的属性,所以我们使用SetAttribute方法来设置该属性。
2、读取XML文件
要读取XML文件,需要先打开文件句柄,然后遍历XML节点,并获取其中的内容和属性。代码如下:
#include "tinyxml.h"
#include <iostream>
int main()
{
TiXmlDocument doc("new_file.xml");
bool isLoaded = doc.LoadFile(); // 加载XML文件
if (!isLoaded)
{
std::cout << "Could not load the XML file." << std::endl;
return -1;
}
TiXmlElement *pRootElement = doc.RootElement();
TiXmlElement *pElem = pRootElement->FirstChildElement();
while (pElem)
{
std::cout << pElem->Value() << std::endl;
const char *pText = pElem->GetText();
if (pText)
{
std::cout << "Text: " << pText << std::endl;
}
TiXmlAttribute *pAttribute = pElem->FirstAttribute();
while (pAttribute)
{
std::cout << pAttribute->Name() << " = " << pAttribute->Value() << std::endl;
pAttribute = pAttribute->Next();
}
pElem = pElem->NextSiblingElement();
}
return 0;
}
我们首先用TiXmlDocument类的LoadFile方法加载XML文件。然后,我们检查XML文件是否成功加载。如果没有加载成功,我们就输出一条错误消息并退出程序。否则,我们取得根节点pRootElement,然后以FirstChildElement方法开始遍历其子节点。对于每个节点,我们输出其名称(Value);如果该节点有文本内容,我们输出其文本内容(GetText)。我们还遍历了节点的属性,输出它们的名称(Name)和值(Value)。
Qt中读写XML文件
在Qt中,可以使用QXmlStreamReader和QXmlStreamWriter两个类来读写XML文件。下面介绍如何使用这两个类进行XML文件读写。
1、创建XML文件
要写入XML文件,我们创建QFile对象并打开文件,然后创建QXmlStreamWriter对象并设置文件输出流。我们可以创建XML节点和子节点,并把它们写入到文件中。代码如下:
#include <QFile>
#include <QXmlStreamWriter>
int main()
{
QFile file("new_file.xml");
if (!file.open(QFile::WriteOnly | QFile::Truncate))
return -1;
QXmlStreamWriter xmlWriter(&file);
xmlWriter.setAutoFormatting(true);
xmlWriter.writeStartDocument();
xmlWriter.writeStartElement("Root");
// 创建第一个子节点
xmlWriter.writeStartElement("ChildNode1");
xmlWriter.writeCharacters("Content of the ChildNode1 tag");
xmlWriter.writeEndElement();
// 创建第二个子节点
xmlWriter.writeStartElement("ChildNode2");
xmlWriter.writeAttribute("attribute", "the attribute value");
xmlWriter.writeCharacters("Content of the ChildNode2 tag");
xmlWriter.writeEndElement();
xmlWriter.writeEndElement();
xmlWriter.writeEndDocument();
file.close();
return 0;
}
可以看到,我们首先打开文件new_file.xml,并创建了QXmlStreamWriter对象xmlWriter,并设置了其自动格式化属性为true。然后,我们使用writeStartDocument方法写入XML声明,并使用writeStartElement写入根节点。然后,我们使用writeStartElement创建每个子节点,使用writeAttributes设置其属性,使用writeCharacters写入内容,最后使用writeEndElement结束该子节点。以此类推,直到我们结束最后一个子节点并使用writeEndElement结束根节点。我们最后调用writeEndDocument方法来结束XML文件。
2、读取XML文件
要读取XML文件,我们创建QFile对象并打开文件,然后创建QXmlStreamReader对象并设置文件输入流。我们可以遍历XML节点,并获取其中的内容和属性。代码如下:
#include <QFile>
#include <QXmlStreamReader>
#include <QDebug>
int main()
{
QFile file("new_file.xml");
if (!file.open(QFile::ReadOnly | QFile::Text))
return -1;
QXmlStreamReader xmlReader(&file);
while (!xmlReader.atEnd() && !xmlReader.hasError())
{
QXmlStreamReader::TokenType token = xmlReader.readNext();
if (token == QXmlStreamReader::StartElement)
{
qDebug() << "Element:" << xmlReader.name();
if (xmlReader.attributes().count() > 0)
{
qDebug() << "Attributes:";
QXmlStreamAttributes attributes = xmlReader.attributes();
for (int i = 0; i < attributes.count(); i++)
{
qDebug() << attributes.at(i).name() << " = " << attributes.at(i).value();
}
}
}
else if (token == QXmlStreamReader::Characters && !xmlReader.isWhitespace())
{
qDebug() << "Text:" << xmlReader.text().toString();
}
}
file.close();
return 0;
}
我们首先打开文件,然后创建QXmlStreamReader对象xmlReader,并设置其为文件输入流。我们在循环中使用readNext方法读取每个XML节点,并根据节点的类型进行处理。对于每个StartElement节点,我们调用name方法来输出其名称,并检查它是否有属性(attributes)。如果有属性,我们使用attributes方法获得这些属性,并输出它们的名称(name)和值(value)。对于Characters节点,我们使用text方法获得文本内容,并打印出来。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++、Qt分别读写xml文件的方法实例 - Python技术站