qt中xml的读取

引言

该文章是基于上一篇文章,xml生成而写的,其所用的xml文件的内容是上一篇中的内容。

示例1

文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<server>
    <helperIp>127.0.0.1</helperIp>
    <sendPort>8900</sendPort>
    <receviePort>9666</receviePort>
    <kserver>127.0.0.1</kserver>
    <kPort>9080</kPort>
    <upServer>127.0.0.1</upServer>
    <upPort>7999</upPort>
</server>

读xml文件

const QString strSourceConfigFileName = "/serversInfo.xml";

void Config::readServerInfoFile()
{
    QString strPath = getExeFilePath();
    strPath += strSourceConfigFileName;
    QFile file(strPath);
    if (!file.open(QIODevice::ReadOnly)) {//之前的内容被清空
        qDebug()<<QStringLiteral("打开")<<strPath<<QStringLiteral("文件失败!");
        return;
    }

    QDomDocument doc;
    if (!doc.setContent(&file)) {
        qDebug()<<QStringLiteral("文件")<<strPath<<QStringLiteral("解析失败!");
        file.close();
        return ;
    }
    file.close();
    QDomElement root = doc.documentElement();
    QDomNode node = root.firstChild();
    while (!node.isNull()) {
        if (node.isElement()) {
            QDomElement serverElement = node.toElement();
            if (serverElement.tagName() == "helperIp") {
                m_localIP = serverElement.text();
            }else if (serverElement.tagName() == "sendPort") {
                m_localSendMsgPort = serverElement.text().toUInt();
            }else if (serverElement.tagName() == "receviePort") {
                m_localRecevieMsgPort = serverElement.text().toUInt();
            }else if (serverElement.tagName() == "kserver") {
                m_kvmIP = serverElement.text();
            }else if (serverElement.tagName() == "kPort") {
                m_kvmPort = serverElement.text().toUInt();
            }else if (serverElement.tagName() == "upServer") {
                m_upScreenIp = serverElement.text();
            }else if (serverElement.tagName() == "upPort") {
                m_upScreenPort = serverElement.text().toUInt();
            }
        }
        node = node.nextSibling();
    }
}

上面的读取的文件保存的变量的声明如下:

   QString                     m_localIP;//本地IP,与助手通信的IP
    quint16                     m_localRecevieMsgPort;//中间件接收助手消息的端口
    quint16                     m_localSendMsgPort;//中间件发送到助手消息的端口
    QString                     m_kvmIP;//kvm的IP
    quint16                     m_kvmPort;//kvm的端口
    QString                     m_upScreenIp;//上屏的Ip
    quint16                     m_upScreenPort;//上屏的端口

示例2

文件内容:

<?xml version='1.0' encoding='UTF-8'?>
<kvm>
    <seatInfo>
        <seat>
            <sid>12</sid>
            <seatName>席位1</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.32</seatIp>
        </seat>
        <seat>
            <sid>13</sid>
            <seatName>席位2</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.34</seatIp>
        </seat>
        <seat>
            <sid>14</sid>
            <seatName>席位3</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.22</seatIp>
        </seat>
        <seat>
            <sid>15</sid>
            <seatName>席位4</seatName>
            <seatId>12289832899feds</seatId>
            <seatIp>192.168.1.23</seatIp>
        </seat>
        <seat>
            <sid>16</sid>
            <seatName>席位5</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.24</seatIp>
        </seat>
        <seat>
            <sid>17</sid>
            <seatName>席位6</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.25</seatIp>
        </seat>
        <seat>
            <sid>18</sid>
            <seatName>席位7</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.26</seatIp>
        </seat>
        <seat>
            <sid>19</sid>
            <seatName>席位8</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.27</seatIp>
        </seat>
        <seat>
            <sid>20</sid>
            <seatName>席位9</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.28</seatIp>
        </seat>
        <seat>
            <sid>21</sid>
            <seatName>席位10</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.29</seatIp>
        </seat>
        <seat>
            <sid>22</sid>
            <seatName>席位11</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.30</seatIp>
        </seat>
        <seat>
            <sid>23</sid>
            <seatName>席位12</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.31</seatIp>
        </seat>
		  <seat>
            <sid>24</sid>
            <seatName>席位13</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.32</seatIp>
        </seat>
		  <seat>
            <sid>25</sid>
            <seatName>席位14</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.33</seatIp>
        </seat>
		  <seat>
            <sid>26</sid>
            <seatName>席位15</seatName>
            <seatId>12289832899desa</seatId>
            <seatIp>192.168.1.34</seatIp>
        </seat>
    </seatInfo>
    <signalsource>
        <source>
            <uid>1</uid>
            <ip>192.168.1.21</ip>
        </source>
        <source>
            <uid>2</uid>
            <ip>192.168.1.22</ip>
        </source>
        <source>
            <uid>3</uid>
            <ip>192.168.1.23</ip>
        </source>
        <source>
            <uid>4</uid>
            <ip>192.168.1.24</ip>
        </source>
        <source>
            <uid>5</uid>
            <ip>192.168.1.25</ip>
        </source>
        <source>
            <uid>6</uid>
            <ip>192.168.1.26</ip>
        </source>
        <source>
            <uid>7</uid>
            <ip>192.168.1.27</ip>
        </source>
        <source>
            <uid>8</uid>
            <ip>192.168.1.28</ip>
        </source>
		<source>
            <uid>9</uid>
            <ip>192.168.1.29</ip>
        </source>
		<source>
            <uid>10</uid>
            <ip>192.168.1.30</ip>
        </source>
    </signalsource>
</kvm>

读xml文件

void Config::readKvmSeatSourceFile()
{
    QString strPath = getExeFilePath();
    strPath += strKvmConfigFileName;
    QFile file(strPath);
    if (!file.open(QIODevice::ReadOnly)) {
        qDebug()<<QStringLiteral("打开")<<strPath<<QStringLiteral("文件失败!");
        return;
    }

    QDomDocument doc;
    if (!doc.setContent(&file)) {//读xml文件,返回true文件被成功解析
        qDebug()<<QStringLiteral("文件")<<strPath<<QStringLiteral("解析失败!");
        file.close();
        return ;
    }
    file.close();

    QDomElement root = doc.documentElement();//根节点
    QDomNode firstNode = root.firstChild();//第一个子节点
    while (!firstNode.isNull()) {
        if (firstNode.isElement()) {
            QDomElement element = firstNode.toElement();
            if (element.tagName() == "seatInfo") {
                parseSeatInfo(element);
            }else if (element.tagName() == "signalsource") {
                parseSignalSource(element);
            }
        }
        firstNode = firstNode.nextSibling();
    }
}

void Config::parseSeatInfo(QDomElement &element)
{
    if (m_seatSetList.size() != 0) {
        m_seatSetList.clear();
    }
    QDomNodeList nodeList = element.childNodes();
    for (int i = 0; i < nodeList.count(); ++i) {
        QDomNode node = nodeList.at(i);
        if (!node.isNull()) {
            if (node.isElement()) {
                QDomElement seatElement = node.toElement();
                if (seatElement.tagName() == "seat") {
                    parseDetailedSeat(seatElement);
                }
            }
        }
    }
}

void Config::parseSignalSource(QDomElement &element)
{
    if (m_sourceSetList.size() != 0) {
        m_sourceSetList.clear();
    }
    QDomNodeList nodeList = element.childNodes();
    for (int i = 0; i < nodeList.count(); ++i) {
        QDomNode node = nodeList.at(i);
        if (!node.isNull()) {
            if (node.isElement()) {
                QDomElement sourceElement = node.toElement();
                if (sourceElement.tagName() == "source") {
                    parseDetailedSource(sourceElement);
                }
            }
        }
    }
}

void Config::parseDetailedSource(QDomElement &element)
{
    stuSource tempSource;
    QDomNodeList nodeList = element.childNodes();
    for (int i = 0; i < nodeList.size(); ++i) {
        QDomNode node = nodeList.at(i);
        if (!node.isNull()) {
            if (node.isElement()) {
                QDomElement sourceInfoElement = node.toElement();
                if (sourceInfoElement.tagName() == "uid") {
                    tempSource.uid = sourceInfoElement.text().toInt();
                }else if (sourceInfoElement.tagName() == "ip") {
                    tempSource.ip = sourceInfoElement.text();
                }
            }
        }
    }
    m_sourceSetList.append(tempSource);
}

void Config::parseDetailedSeat(QDomElement &element)
{
    stuSeat tempSeat;
    QDomNodeList nodeList = element.childNodes();
    for (int i = 0; i < nodeList.size(); ++i) {
        QDomNode node = nodeList.at(i);
        if (!node.isNull()) {
            if (node.isElement()) {
                QDomElement seatInfoElement = node.toElement();
                if (seatInfoElement.tagName() == "sid") {
                    tempSeat.sid = seatInfoElement.text().toInt();
                }else if (seatInfoElement.tagName() == "seatName") {
                    tempSeat.seatName = seatInfoElement.text();
                }else if (seatInfoElement.tagName() == "seatId") {
                    tempSeat.seatId = seatInfoElement.text();
                }else if (seatInfoElement.tagName() == "seatIp") {
                    tempSeat.seatIp = seatInfoElement.text();
                }
            }
        }
    }
    m_seatSetList.append(tempSeat);
}

最后用来储存数据的声明如下:

    QList<stuSeat>              m_seatSetList;//配置文件中读取设置的席位信息
    QList<stuSource>            m_sourceSetList;//配置文件读取的信号源信息```

其它涉及的数据结构不在细说,读者明白其如何去读就行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肩上风骋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值