Qt XML读写之 QXmlStreamReader、QXmlStreamWriter

Overview

QtXML将不再接收额外的功能。对于迭代地读取或编写XML文档(SAX),Qt建议使用Qt Core的QXmlStreamReader和QXmlStreamWriter类。这些类既易于使用,又更符合XML标准。
但是遗憾的是如果想修改更新XML文档,这个模块没有提供解决方案,还只能使用QDomDocument。
QXmlStreamReader类提供了一个快速解析器,通过一个简单的流API读取格式良好的XML。
QXmlStreamReader的典型循环是这样的:

  QXmlStreamReader xml;
  ...
  while (!xml.atEnd()) {
        xml.readNext();
        ... // do processing
  }
  if (xml.hasError()) {
        ... // do error handling
  }

头文件

#include <QXmlStreamReader> 
#include <QXmlStreamWriter>

示例

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <tag id="1" time="2002/1/1">
        <name>test1</name>
        <value>100</value>
        <!--the first one-->
    </tag>
    <tag id="2" time="2019/2/2">
        <name>test2</name>
        <value>200</value>
    </tag>
</root>

QXmlStreamReader

QString strFile("test1.xml");
    QFile file(strFile);
    if (!file.open(QFile::ReadOnly | QFile::Text)) { 
        return;
    }
    QXmlStreamReader reader(&file);
    while (!reader.atEnd()) {
        QXmlStreamReader::TokenType nType = reader.readNext();
        if (nType == QXmlStreamReader::StartElement) {
            QString tagStr = reader.name().toString();
            qDebug() << reader.name().toString();
            if (QString::compare(tagStr, QStringLiteral("tag")) == 0)
            {
                QXmlStreamAttributes  Attributes = reader.attributes();
                if (Attributes.hasAttribute("id")) {
                    qDebug() << Attributes.value("id").toString();
                }
                if (Attributes.hasAttribute("time")) {
                    qDebug() << Attributes.value("time").toString();
                }
            }
            else if (QString::compare(tagStr, QStringLiteral("root")) == 0)
            {
                
            }
            else
            {
                qDebug() << reader.readElementText();
            }
        }
        else
        {
            if (reader.isStartDocument())
            {
                qDebug() << reader.documentVersion().toString();
                qDebug() << reader.documentEncoding().toString();
            }
            if (reader.isComment())
            {

            }
        }
    }

QXmlStreamWriter

QFile file("test1.xml");
    if (!file.open(QFile::WriteOnly | QFile::Text)) { 
        return;
    }
    QXmlStreamWriter writer(&file);
    writer.setCodec("UTF-8");  // XML 编码
    writer.setAutoFormatting(true); // 自动格式化
    writer.writeStartDocument("1.0", true);  // 开始文档(XML 声明)
    writer.writeStartElement("root");  // 开始根元素 
    writer.writeStartElement("tag");  // 开始子元素 

    writer.writeAttribute("id", "1");  // 属性
    writer.writeAttribute("time", "2002/1/1");  // 属性

    writer.writeTextElement("name", "test1");
    writer.writeTextElement("value", "100");
    writer.writeComment("the first one");
    writer.writeEndElement(); //结束子元素

    writer.writeStartElement("tag");
    writer.writeAttribute("id", "2");  // 属性
    writer.writeAttribute("time", "2019/2/2");  // 属性
    writer.writeTextElement("name", "test2");
    writer.writeTextElement("value", "200");

    writer.writeEndElement();  // 结束子元素 </Blog>
    writer.writeEndElement();  // 结束根元素 </Blogs>
    writer.writeEndDocument();  // 结束文档
    file.close();

参考链接

qxmlstreamwriter
qxmlstreamreader
Modify an XML file QXMLStreamReader/Writer

转载请注明出处。以上只代表个人观点,引用不当或侵权请联系删除。

posted @ 2023-05-09 17:13  yg1990  阅读(492)  评论(0编辑  收藏  举报