test.xml
<bookstore>
<book>
<title>朝花夕拾title>
<writer>鲁迅writer>
book>
<book>
<title>C和指针title>
<writer>KennethA.Reekwriter>
book>
bookstore>
main.cpp
#include
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("test.xml");
file.open(QIODevice::ReadOnly);
QDomDocument doc;
doc.setContent(&file);
QDomElement root = doc.documentElement();
QDomNode node = root.firstChild();
while(!node.isNull()){
auto children = node.childNodes();
for(int i = 0; i < children.count(); ++i){
qDebug() << children.at(i).toElement().text();
}
node = node.nextSibling();
}
file.close();
return a.exec();
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(XMLTest LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core)
find_package(Qt6 REQUIRED COMPONENTS Xml)
add_executable(XMLTest
main.cpp
test.xml
)
target_link_libraries(XMLTest Qt${QT_VERSION_MAJOR}::Core)
target_link_libraries(XMLTest Qt${QT_VERSION_MAJOR}::Xml)
通过阅读XML文件的内容,我们可以知道有一个bookstore的根节点。
在bookstore下,又有4个book子节点,book里面有子节点title和writer
该类需要包含XML模块(qmake或者cmake)
Qt官方对该类的说明:“QDomDocument类表示一个XML文档。”
本文使用的是setContent的IO输入版本
该函数从 IO 设备 dev 读取 XML 文档,如果成功解析内容,则返回 true; 否则返回 false。
其实就是设置文档内容。
bool QDomDocument::setContent(
QIODevice *dev,
bool namespaceProcessing,
QString *errorMsg = nullptr,
int *errorLine = nullptr,
int *errorColumn = nullptr);
返回文档的根元素,本文是bookstore。
QDomElement QDomDocument::documentElement() const;
QDomElement 类表示 DOM 树中的一个元素。
返回节点的第一个子节点。如果没有子节点,则返回空节点。更改返回的节点也将更改文档树中的节点。
QDomNode 类是 DOM 树中所有节点的基类。
QDomElement类的父类,用法类似
QFile file("test.xml");
file.open(QIODevice::ReadOnly);
使用完之后别忘记关闭
file.close();
QDomDocument doc;
doc.setContent(&file);
QDomElement root = doc.documentElement();
QDomNode node = root.firstChild();
doc是QDomDocument的一个对象,创建完之后我们把刚刚那个打开的文件传入进去作为IO设备进行读写,root接该文档的根节点即bookstore,并尝试访问第一个节点(node)。
while(!node.isNull()){
auto children = node.childNodes();
for(int i = 0; i < children.count(); ++i){
qDebug() << children.at(i).toElement().text();
}
node = node.nextSibling();
}
这里太懒了,使用的是auto,实际推导成QDomNodeList
node是第一个book,我们用children接node的所有子节点,再遍历这个children达到我们的目的
最后要将node节点置成下一个节点,否则这个循环是出不来的,等到node读到最后一个节点之后为空,循环执行完成