//读取文件到内存
auto str = io::ReaderWriter::read(filename);
if (str.isEmpty())
{
QMessageBox::warning(this, zhTr("警告信息"), zhTr("文件读取失败!"));
return;
}
//定义存储
std::pair<double, double> center, lefttop, righttop, leftbottom, rightbottom;
QXmlStreamReader xml(str);
while (!xml.atEnd())
{
QXmlStreamReader::TokenType t = xml.readNext();
if (t == QXmlStreamReader::StartDocument)
{
auto ver = xml.documentVersion().toString();
auto encoding = xml.documentEncoding().toString();
bool st = xml.isStandaloneDocument();
}
else if (t == QXmlStreamReader::StartElement)
{
QString name = xml.name().toString();
if (name == "SARProcessingParametersofSASMAC_XML")
{
continue;
}
else if (name == "sceneCenterCoord")
{
center = parseLatLon(xml, name);
}
else if (name == "sceneLeftTopCoord")
{
lefttop = parseLatLon(xml, name);
}
else if (name == "sceneRightTopCoord")
{
righttop = parseLatLon(xml, name);
}
else if (name == "sceneLeftBottomCoord")
{
leftbottom = parseLatLon(xml, name);
}
else if (name == "sceneRightBottomCoord")
{
rightbottom = parseLatLon(xml, name);
}
}
}
解析函数如下:
std::pair<double, double> parseLatLon(QXmlStreamReader& xml, const QString& tags)
{
std::pair<double, double> tmp;
while (!xml.atEnd())
{
QXmlStreamReader::TokenType t = xml.readNext();
if (t == QXmlStreamReader::StartElement)
{
auto name = xml.name().toString();
if (name == "lat")
{
tmp.first = xml.readElementText().toDouble();
}
else if (name == "lon")
{
tmp.second = xml.readElementText().toDouble();
}
}
else if(t == QXmlStreamReader::EndElement)
{
break;
}
}
return tmp;
}
通常,XML文件是比较常用的文件,一些工程文件、配置文件都采用这种格式,如何能使用最少的代码量且快速的这种格式的解析,在处理业务功能时所面对的必然思考。需要对基础的功能进行积累,以便取之即用。
QXmlStreamReader类是Qt提供的读取xml的工具类中的一种,使用起来简单方便。