louis_liux 2024-07-21 17:32 采纳率: 33.3%
浏览 3

Qt、XML读写 QXmlStreamReader

Qt的QXmlStreamReader 如何读取一下不规则的xml 把每个属性都读取出来

测试123 123,123 0,0 123,123 123,123,123 123,123 1 Name1 2140 2320 -161.6 0 1 123 123 0 1 1 8 0 100 0
  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-07-21 17:32
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    在Qt中,QXmlStreamReader 是一个非常有用的类,用于读取和解析XML数据。以下是一些步骤和示例代码,帮助你使用 QXmlStreamReader 解析不规则的XML文件,并提取其中的元素和属性。

    1. 读取XML文件中的元素和属性

    首先,你需要包含QXmlStreamReader的头文件,并创建一个QXmlStreamReader对象。然后,你可以使用readNext()方法来逐个读取XML元素,使用name()readElementText()来获取元素的名称和文本内容。

    #include <QXmlStreamReader>
    
    void parseXml(const QString &xmlData) {
        QXmlStreamReader reader(xmlData);
    
        while (!reader.atEnd()) {
            reader.readNext();
            if (reader.isStartElement()) {
                QString elementName = reader.name().toString();
                QString elementText = reader.readElementText();
                qDebug() << "Element:" << elementName << "Value:" << elementText;
            }
        }
    }
    

    2. 处理属性值中包含逗号或空格的情况

    属性值中的特殊字符(如逗号或空格)不会影响QXmlStreamReader的解析。你可以正常读取元素的文本内容。如果需要进一步处理这些值(例如,分割逗号),你可以使用QString的split()方法。

    QString elementValue = reader.readElementText().trimmed();
    QStringList values = elementValue.split(',', QString::SkipEmptyParts);
    

    3. 存储或进一步处理读取到的数据

    你可以使用QMap或QList等数据结构来存储读取到的数据。例如,使用QMap存储元素名称和对应的值:

    QMap<QString, QString> dataMap;
    
    while (!reader.atEnd()) {
        if (reader.isStartElement()) {
            QString elementName = reader.name().toString();
            QString elementText = reader.readElementText().trimmed();
            dataMap[elementName] = elementText;
        }
    }
    

    4. 确保代码的健壮性和错误处理

    使用QXmlStreamReader时,你应该检查各种可能的错误状态,如hasError(),并适当地处理它们。此外,确保你的文件路径正确,并且文件确实存在。

    if (reader.hasError()) {
        qDebug() << "Error:" << reader.errorString();
        return;
    }
    

    示例代码

    这是一个完整的示例,展示了如何使用QXmlStreamReader读取XML文件,并存储元素名称和值到QMap中:

    #include <QXmlStreamReader>
    #include <QMap>
    #include <QDebug>
    
    void readXmlFile(const QString &filePath) {
        QFile file(filePath);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
            qDebug() << "Failed to open file:" << file.errorString();
            return;
        }
    
        QXmlStreamReader reader(&file);
        QMap<QString, QString> dataMap;
    
        while (!reader.atEnd()) {
            reader.readNext();
            if (reader.isStartElement()) {
                QString elementName = reader.name().toString();
                QString elementText = reader.readElementText().trimmed();
                dataMap[elementName] = elementText;
            }
        }
    
        if (reader.hasError()) {
            qDebug() << "Error:" << reader.errorString();
        } else {
            qDebug() << "Data read successfully:";
            for (auto it = dataMap.constBegin(); it != dataMap.constEnd(); ++it) {
                qDebug() << it.key() << ":" << it.value();
            }
        }
    
        file.close();
    }
    
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
        QString filePath = "path/to/your/xmlfile.xml";
        readXmlFile(filePath);
        return app.exec();
    }
    

    这个示例程序将打开一个XML文件,读取其内容,并打印出每个元素的名称和值。记得替换filePath变量的值为你的XML文件的实际路径。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月21日
  • 创建了问题 7月21日

悬赏问题

  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现
  • ¥15 有人会SIRIUS 5.8.0这个软件吗