XML文件读写

xmlstream.h

#include <QXmlStreamWriter>
#include <QXmlStreamReader>

class XmlStream
{
public:
    XmlStream();

    void writeXml();
    void readXml();
    void parseBlog(QXmlStreamReader &reader);
};

xmlstream.cpp

#include "xmlstream.h"

#include <QFile>
#include <QDebug>


XmlStream::XmlStream()
{

}

void XmlStream::writeXml()
{
    QString strFile("Blogs.xml");
    QFile file(strFile);
    if (!file.open(QFile::WriteOnly | QFile::Text)) { // 只写模式打开文件
        qDebug() << QString("Cannot write file %1(%2).").arg(strFile).arg(file.errorString());
        return;
    }

    QXmlStreamWriter writer(&file);
    // writer.setCodec("GBK");  // XML 编码
    writer.setAutoFormatting(true); // 自动格式化
    writer.writeStartDocument("1.0", true);  // 开始文档(XML 声明)
    writer.writeComment(QString::fromLocal8Bit("纯正开源之美,有趣、好玩、靠谱。。。"));  // 注释
    writer.writeProcessingInstruction("xml-stylesheet type=\"text/css\" href=\"style.css\"");  // 处理指令

    // DTD
    writer.writeDTD(QString::fromLocal8Bit("<!DOCTYPE Blogs [ <!ENTITY Copyright \"Copyright 2016《Qt实战一二三》\"> <!ELEMENT Blogs (Blog)> <!ELEMENT Blog (作者,主页,个人说明)> <!ELEMENT 作者     (#PCDATA)> <!ELEMENT 主页     (#PCDATA)> <!ELEMENT 个人说明  (#PCDATA)> ]>"));

    writer.writeStartElement("Blogs");  // 开始根元素 <Blogs>
    writer.writeAttribute("Version", "1.0");  // 属性

    writer.writeStartElement("Blog");  // 开始子元素 <Blog>
    writer.writeTextElement(QString::fromLocal8Bit("作者"), QString::fromLocal8Bit("一去丶二三里"));
    writer.writeTextElement(QString::fromLocal8Bit("主页"), "http://blog.csdn.net/liang19890820");
    writer.writeTextElement(QString::fromLocal8Bit("个人说明"), QString::fromLocal8Bit("青春不老,奋斗不止!"));
    writer.writeEntityReference("Copyright");
    writer.writeCDATA(QString::fromLocal8Bit("<Qt分享&&交流>368241647</Qt分享&&交流>"));
    writer.writeCharacters(">");
    writer.writeEmptyElement(QString::fromLocal8Bit("Empty"));  // 空元素
    writer.writeEndElement();  // 结束子元素 </Blog>

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

    file.close();  // 关闭文件


    //    注意:使用 writeStartElement() 打开元素标签后,要有相应的 writeEndElement() 来关闭。

}

void XmlStream::readXml()
{
    QFile file("Blogs.xml");
    if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {  // 以只写模式打开文件
        QXmlStreamReader reader(&file);

        // 解析 XML,直到结束
        while (!reader.atEnd()) {

            // 读取下一个元素
            QXmlStreamReader::TokenType nType = reader.readNext();

            switch (nType) {
            case QXmlStreamReader::StartDocument: {  // 开始文档
                qDebug() << QString::fromLocal8Bit("********** 开始文档(XML 声明) ********** ");
                // XML 声明
                QString strVersion = reader.documentVersion().toString();
                QString strEncoding = reader.documentEncoding().toString();
                bool bAlone = reader.isStandaloneDocument();
                qDebug() << QString::fromLocal8Bit("版本:%1  编码:%2  Standalone:%3")
                            .arg(strVersion).arg(strEncoding).arg(bAlone) << "\r\n";
                break;
            }
            case QXmlStreamReader::Comment: {  // 注释
                qDebug() << QString::fromLocal8Bit("********** 注释 ********** ");
                QString strComment = reader.text().toString();
                qDebug() << strComment << "\r\n";
                break;
            }
            case QXmlStreamReader::ProcessingInstruction: {  // 处理指令
                qDebug() << QString::fromLocal8Bit("********** 处理指令 ********** ");
                QString strProcInstr = reader.processingInstructionData().toString();
                qDebug() << strProcInstr << "\r\n";
                break;
            }
            case QXmlStreamReader::DTD: {   // DTD
                qDebug() << QString::fromLocal8Bit("********** DTD ********** ");
                QString strDTD = reader.text().toString();
                QXmlStreamNotationDeclarations notationDeclarations = reader.notationDeclarations();  // 符号声明
                QXmlStreamEntityDeclarations entityDeclarations = reader.entityDeclarations();  // 实体声明
                // DTD 声明
                QString strDTDName = reader.dtdName().toString();
                QString strDTDPublicId = reader.dtdPublicId().toString();  // DTD 公开标识符
                QString strDTDSystemId = reader.dtdSystemId().toString();  // DTD 系统标识符
                qDebug() << QString::fromLocal8Bit("DTD : %1").arg(strDTD);
                qDebug() << QString::fromLocal8Bit("DTD 名称 : %1").arg(strDTDName);
                qDebug() << QString::fromLocal8Bit("DTD 公开标识符 : %1").arg(strDTDPublicId);
                qDebug() << QString::fromLocal8Bit("DTD 系统标识符 : %1").arg(strDTDSystemId);
                qDebug() << "\r\n";

                break;
            }
            case QXmlStreamReader::StartElement: {  // 开始元素
                QString strElementName = reader.name().toString();
                if (QString::compare(strElementName, "Blogs") == 0) {  // 根元素
                    qDebug() << QString::fromLocal8Bit("********** 开始元素<Blogs> ********** ");
                    QXmlStreamAttributes attributes = reader.attributes();
                    if (attributes.hasAttribute("Version")) {
                        QString strVersion = attributes.value("Version").toString();
                        qDebug() << QString::fromLocal8Bit("属性:Version(%1)").arg(strVersion);
                    }

                    parseBlog(reader);
                }
                break;
            }
            case QXmlStreamReader::EndDocument: {  // 结束文档
                qDebug() << QString::fromLocal8Bit("********** 结束文档 ********** ");
                break;
            }
            }
        }

        if (reader.hasError()) {  // 解析出错
            qDebug() << QString::fromLocal8Bit("错误信息:%1  行号:%2  列号:%3  字符位移:%4").arg(reader.errorString()).arg(reader.lineNumber()).arg(reader.columnNumber()).arg(reader.characterOffset());
        }

        file.close();  // 关闭文件
    }
}

void XmlStream::parseBlog(QXmlStreamReader &reader)
{
    while (!reader.atEnd()) {
        reader.readNext();
        if (reader.isStartElement()) {  // 开始元素
            QString strElementName = reader.name().toString();
            if (QString::compare(strElementName, "Blog") == 0) {
                qDebug() << QString::fromLocal8Bit("********** 开始元素<Blog> ********** ");
            } else if (QString::compare(strElementName, QStringLiteral("作者")) == 0) {  // 方式一
                reader.readNext();
                if (reader.isCharacters()) {
                    qDebug() << QStringLiteral("作者:%1").arg(reader.text().toString());
                }
            } else if (QString::compare(strElementName, QStringLiteral("主页")) == 0) {  // 方式二
                qDebug() << QStringLiteral("主页:%1").arg(reader.readElementText());
            } else if (QString::compare(strElementName, QStringLiteral("个人说明")) == 0) {
                qDebug() << QStringLiteral("个人说明:%1").arg(reader.readElementText());
            }
        } else if (reader.isEntityReference()) {  // 实体引用
            QString strName = reader.name().toString();
            QString strText = reader.text().toString();
            qDebug() << QString("EntityReference : %1(%2)").arg(strName).arg(strText);
        } else if (reader.isCDATA()) {  // CDATA
            QString strCDATA = reader.text().toString();
            qDebug() << QString("CDATA : %1").arg(strCDATA);

            reader.readNext();
            if (reader.isCharacters()) {
                QString strCharacters = reader.text().toString();
                qDebug() << QString("Characters : %1").arg(strCharacters);
            }
        } else if (reader.isEndElement()) {  // 结束元素
            QString strElementName = reader.name().toString();
            if (QString::compare(strElementName, "Blogs") == 0) {
                qDebug() << QString::fromLocal8Bit("********** 结束元素<Blogs> ********** ");
                break;  // 跳出循环(解析 QXmlStreamReader::EndDocument)
            } else if (QString::compare(strElementName, "Blog") == 0) {
                qDebug() << QString::fromLocal8Bit("********** 结束元素<Blog> ********** ");
            }
        }
    }
}

main.cpp

#include <QCoreApplication>

#include "xmlstream.h"

#include <QFile>
#include <QDebug>


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    XmlStream x;
    x.writeXML();
    x.readXml();

    return a.exec();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# XML文件读写操作源码,以及如何调用,注释详解,有任何问题请留言, 以下截取xml文件和部分调用代码段: * ++++++++++++++++++++++++++++++++++++++ <?xml version="1.0" encoding="utf-8" standalone="no"?> <!--TestPlugins的信息--> <!--DataPlugins的信息--> * ++++++++++++++++++++++++++++ xml xl = new xml(); xl.XMLWriteRootNode("info"); //XmlElement Eml1 = xl.XMLReadNode("",0); //XmlElement Eml2 = xl.XMLReadNode("DataPlugins", 1); //XmlElement Eml4 = xl.XMLReadNode("DeviceInfo", 2); // TestPlugins XmlElement testPlugins = xl.XMLCreateNode("TestPlugins", null, null); xl.XMLInsertNode("info", 0, "TestPlugins的信息", testPlugins); // FixturePlugin XmlElement fixturePlugin = xl.XMLCreateNode("TestPlugin", null, new Dictionary() { { "Type", "FixturePlugin" } }); xl.XMLInsertNode(testPlugins.LocalName, 1, null, fixturePlugin); // DUTPlugin XmlElement DUTPlugin = (XmlElement)fixturePlugin.CloneNode(true);// xl.XMLCreateNode("TestPlugin", null, new Dictionary() { { "Type", "DUTPlugin" } }); DUTPlugin.SetAttribute("Type", "DUTPlugin"); xl.XMLInsertNode(testPlugins.LocalName, 1, null, DUTPlugin); // Agilent34461APlugin XmlElement Agilent34461APlugin = xl.XMLCreateNode("TestPlugin", null, new Dictionary() { { "Type", "Agilent34461APlugin" } }); xl.XMLInsertNode(testPlugins.LocalName, 1, null, Agilent34461APlugin); // ================================== // DataPlugins XmlElement dataPlugins = xl.XMLCreateNode("DataPlugins", null, null); xl.XMLInsertNode("info", 0, "DataPlugins的信息", dataPlugins); // CSVLogPlugin XmlElement csvlogPlugin = xl.XMLCreateNode("DataPlugin", null, new Dictionary() { { "Type", "CSVLogPlugin" } }); xl.XMLInsertNode(dataPlugins.LocalName, 1, null, csvlogPlugin); XmlElement uartlogPlugin = (XmlElement)csvlogPlugin.CloneNode(true); uartlogPlugin.SetAttribute("Type", "UartLogPlugin"); xl.XMLInsertNode(dataPlugins.LocalName, 1, null, uartlogPlugin); XmlElement testlogPlugin = (XmlElement)csvlogPlugin.CloneNode(true); testlogPlugin.SetAttribute("Type", "TestLogPlugin"); xl.XMLInsertNode(dataPlugins.LocalName, 1, null, testlogPlugin); }
你可以使用Qt的QtCore和QtXml模块来读写XML文件。下面是一个简单的示例代码,展示了如何使用Qt读取XML文件和写入XML文件: ```cpp #include <QtXml/QtXml> #include <QtCore/QFile> #include <QtCore/QIODevice> int main() { // 读取XML文件 QFile file("example.xml"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Failed to open XML file for reading."; return -1; } QDomDocument doc; if (!doc.setContent(&file)) { qDebug() << "Failed to parse XML."; file.close(); return -1; } file.close(); // 遍历XML数据 QDomElement root = doc.documentElement(); QDomNodeList nodes = root.childNodes(); for (int i = 0; i < nodes.count(); i++) { QDomNode node = nodes.at(i); if (node.isElement()) { QDomElement element = node.toElement(); qDebug() << "Element name:" << element.tagName(); qDebug() << "Element value:" << element.text(); } } // 写入XML文件 QFile outputFile("output.xml"); if (!outputFile.open(QIODevice::WriteOnly)) { qDebug() << "Failed to open output XML file."; return -1; } QTextStream stream(&outputFile); doc.save(stream, 4); // 缩进为4个空格 outputFile.close(); return 0; } ``` 上述示例代码首先打开一个XML文件进行读取,然后使用`QDomDocument`类解析XML数据。通过遍历`QDomDocument`对象的子节点,可以获得每个元素的标签名和文本值。最后,将解析后的XML数据保存到新的XML文件中。 请注意,上述代码中使用的XML文件名为"example.xml"和"output.xml",你可以根据自己的需要修改这些文件名。此外,你需要在.pro文件中添加`QT += xml`以包含QtXml模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值