C++ Qt解析XML

C++ Qt解析XML文件

  • 1.待读取的XML文件数据
  • 2.源代码
  • 3.解析
    • QDomDocument类
      • setContent成员函数
      • documentElement成员函数
    • QDomElement类
      • firstChild成员函数
    • QDomNode类
    • 解析XML
      • 1.获取IO设备,即读取test.xml文件
      • 2.创建XML文档对象(QDomDocument)
      • 3.读取数据
      • 4.结果

1.待读取的XML文件数据

test.xml


<bookstore>
    <book>
        <title>朝花夕拾title>
        <writer>鲁迅writer>
    book>
    <book>
        <title>C和指针title>
        <writer>KennethA.Reekwriter>
    book>
bookstore>

2.源代码

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)

3.解析

通过阅读XML文件的内容,我们可以知道有一个bookstore的根节点。
在bookstore下,又有4个book子节点,book里面有子节点title和writer

QDomDocument类

该类需要包含XML模块(qmake或者cmake)
Qt官方对该类的说明:“QDomDocument类表示一个XML文档。”

setContent成员函数

本文使用的是setContent的IO输入版本
该函数从 IO 设备 dev 读取 XML 文档,如果成功解析内容,则返回 true; 否则返回 false。
其实就是设置文档内容。

bool QDomDocument::setContent(
	 QIODevice *dev, 
	 bool namespaceProcessing, 
	 QString *errorMsg = nullptr, 
     int *errorLine = nullptr, 
     int *errorColumn = nullptr);

documentElement成员函数

返回文档的根元素,本文是bookstore。

 QDomElement QDomDocument::documentElement() const;

QDomElement类

QDomElement 类表示 DOM 树中的一个元素。

firstChild成员函数

返回节点的第一个子节点。如果没有子节点,则返回空节点。更改返回的节点也将更改文档树中的节点。

QDomNode类

QDomNode 类是 DOM 树中所有节点的基类。
QDomElement类的父类,用法类似

解析XML

1.获取IO设备,即读取test.xml文件

 QFile file("test.xml");
 file.open(QIODevice::ReadOnly);

使用完之后别忘记关闭

 file.close();

2.创建XML文档对象(QDomDocument)

 QDomDocument doc;
 doc.setContent(&file);
 QDomElement root = doc.documentElement();
 QDomNode node = root.firstChild();

doc是QDomDocument的一个对象,创建完之后我们把刚刚那个打开的文件传入进去作为IO设备进行读写,root接该文档的根节点即bookstore,并尝试访问第一个节点(node)。

3.读取数据

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读到最后一个节点之后为空,循环执行完成

4.结果

C++ Qt解析XML_第1张图片

你可能感兴趣的:(C++,xml,c++,qt)