引言
该文章是基于上一篇文章,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,与助手通信的IPquint16 m_localRecevieMsgPort;//中间件接收助手消息的端口quint16 m_localSendMsgPort;//中间件发送到助手消息的端口QString m_kvmIP;//kvm的IPquint16 m_kvmPort;//kvm的端口QString m_upScreenIp;//上屏的Ipquint16 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;//配置文件读取的信号源信息```其它涉及的数据结构不在细说,读者明白其如何去读就行。