四时宝库

程序员的知识宝库

Qt——QXmlStreamReader(qt调用qml)

    //读取文件到内存
    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的工具类中的一种,使用起来简单方便。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接