QXmlStreamReader:一种快速的基于流的方式访问良格式 XML 文档,特别适合于实现一次解析器(所谓“一次解析器”,可以理解成我们只需读取文档一次,然后像一个遍历器从头到尾一次性处理 XML 文档,期间不会有反复的情况,也就是不会读完第一个标签,然后读第二个,读完第二个又返回去读第一个,这是不允许的);
DOM(Document Object Model):将整个 XML 文档读入内存,构建成一个树结构,允许程序在树结构上向前向后移动导航,这是与另外两种方式最大的区别,也就是允许实现多次解析器(对应于前面所说的一次解析器)。DOM 方式带来的问题是需要一次性将整个 XML 文档读入内存,因此会占用很大内存;
SAX(Simple API for XML):提供大量虚函数,以事件的形式处理 XML 文档。这种解析办法主要是由于历史原因提出的,为了解决 DOM 的内存占用提出的(在现代计算机上,这个一般已经不是问题了)。
XML文件如下:
<?xml version='1.0' encoding='UTF-8'?>
<china>
<beijing>
<haidian>
<university>
<peking>
<cs>
<name>奥巴马</name>
</cs>
</peking>
</university>
</haidian>
</beijing>
</china>
Qt解析代码如下:
QDomDocument doc;
QDomElement root;
QString filename = "D:\\Qt Projects\\TestXML_1\\demo.xml";
QFile file(filename);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QMessageBox::critical(this, "文件打开失败", QString("不能打开文件:%1").arg(filename));
return;
}
QString error;
int errrow, errcol;
if(!doc.setContent(&file, false, &error, &errrow, &errcol))
{
QMessageBox::critical(this, "文件解析失败",
QString("解析错误行:%1, 列:%2:%3")
.arg(errrow)
.arg(errcol)
.arg(error));
file.close();
return;
}
root = doc.documentElement();
file.close();
QString path = "china/beijing/haidian/university/peking/cs/name";
QStringList strlist = path.split("/");
QDomElement element = root;
for(int i=1; i<strlist.count(); i++)
{
element = element.firstChildElement(strlist.at(i));
}
qDebug() << element.nodeName() << "\t" << element.text();
运行结果:
22:58:14: Starting D:\Qt Projects\build-TestXML_1-Desktop_Qt_6_0_3_MinGW_64_bit-Debug\debug\TestXML_1.exe ...
"name" "奥巴马"
22:58:17: D:\Qt Projects\build-TestXML_1-Desktop_Qt_6_0_3_MinGW_64_bit-Debug\debug\TestXML_1.exe exited with code 0