示例
不用考虑XML的编码格式。
针对每一层标签分析,产生树形结构,按照标签结构分析。
#include <QtCore/QCoreApplication>
#include <QFile>
#include <QDomElement>
#include <QDebug>
void ReadXml()
{
//打开或创建文件
QFile file("D:/JBXML/teachers.xml"); //相对路径、绝对路径、资源路径都行
if (!file.open(QFile::ReadOnly))
return;
QDomDocument doc;
if (!doc.setContent(&file))
{
file.close();
return;
}
file.close();
QDomElement root = doc.documentElement(); //返回根节点
qDebug() << root.nodeName();
QDomNode node = root.firstChild(); //获得第一个子节点
while (!node.isNull()) //如果节点不空
{
if (node.isElement()) //如果节点是元素
{
QDomElement e = node.toElement(); //转换为元素,注意元素和节点是两个数据结构,其实差不多
qDebug() << e.tagName() << " " << e.attribute("id") << " " << e.attribute("time"); //打印键值对,tagName和nodeName是一个东西
QDomNodeList list = e.childNodes();
for (int i = 0; i < list.count(); i++) //遍历子元素,count和size都可以用,可用于标签数计数
{
QDomNode n = list.at(i);
if (node.isElement())
qDebug() << n.nodeName() << ":" << n.toElement().text();
}
}
node = node.nextSibling(); //下一个兄弟节点,nextSiblingElement()是下一个兄弟元素,都差不多
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
ReadXml();
return a.exec();
}
难以理解,把QDomElement当做QDomNode就可以了。
在分析的时候,这两个代表相同的东西,
从算法角度说,Node是树形结构的解析;
从XML和HTML等角度说,这是一个标签tag;
可以忽略XML文件的encoding格式,不管是utf-8还是GBK,都可以当做节点,进行解析。