引言
该文章是基于上一篇文章,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;//配置文件读取的信号源信息```
其它涉及的数据结构不在细说,读者明白其如何去读就行。