利用XML在QTextBrowser显示带图片的文件

       XML简介(自C++ GUI Qt 4编程(第二版)第16章XML):

       XML(eXtensible Markup Language,可扩展标记语言)是普遍用于数据交换和数据存储的一种多用途文本文件格式。XML首先是由万维网协会(World Wide Web Consortium,W3C)作为SGML的一个替代品来开发的。它的语法规则与HTML相似,不过XML是一种用于语言分析的语言,它并没有要求专业的标记符、属性或条目。HTML的XML兼容版称为XHTML。

       对于一般的XML数据处理,Qt提供了QtXml模块,这是本章的主题。QtXml模块提供了三种截然不同的应用程序编程接口用来读取XML文档。

       1、QXmlStreamReader是一个用于读取格式良好的XML文档的快速解析器。

       2、DOM(文档对象模型)把XML文档转换为应用程序可以遍历的树形结构。

       3、SAX(XML简单应用程序编程接口)通过虚拟函数直接向应用程序报告"解析事件"。

       QXmlStreamReader类最快且最易于使用,它同时还提供了于其他Qt兼容的应用程序编程接口。它很适用于编写单通解析器。DOM的主要优点是它能以任意顺序遍历XML文档的树形表示,同时可以实现多通解析算法。有一些应用程序甚至使用DOM树作为它们的基本数据结构。SAX则因为一些历史原因而被得以沿用至今,使用QXmlStreamReader通常会有更加简单高效的编码。

       对于XML文件的写入,Qt也提供了三种可用的方法:

       1、使用QXmlStreamWriter.

       2、在内存中以DOM树的结构表示数据,并要求这个树型结构将自己写到文件中。

       3、手动生成XML。

      使用QXmlStreamWriter是目前最简单易行的方式,同时它也比手动生成XML文档更加可靠。使用DOM生成XML的方法,在DOM树已作为应用程序的基本数据结构时才真正有意义。

 

          例如:

      现假设显示文件名: file.xx

      文件内容如下:

      内容一...

      图片一...

      内容二...

 

      即将文件可分为三部分,内容一文件file1.xx ,图片一, 内容二文件file2.xx

      即动手写XML可如下:



    
    
    
    
    
    

      再通过QXmlStreamReader来读取XML文件,代码如下:
      

//继承QTextBrowser, 其中成员函数QXmlStreamReader reader;    
//read (.xx)files
void ContentsTextBrowser::readXxFiles(const QString &fileName)
{
    QFile file(fileName);
    if(!file.open(QIODevice::ReadOnly)) {
        QMessageBox::warning(this, tr("Load (.xx)File"),
                             file.errorString(),
                             QMessageBox::Yes);
    }
    //append deciphering .ds files to textbrowser
    append(file.readAll());

    file.close();
}
//read xml files
void ContentsTextBrowser::readXmlFiles(const QString &fileName)
{
    QFile file(fileName);
    if (!file.open(QFile::ReadOnly | QFile::Text)) {
        QMessageBox::warning(this, "Read Xml File",
                             file.errorString(),
                             QMessageBox::Yes);
    }
    //set XmlStreamReader's IODevice
    reader.setDevice(&file);

    //read xml file contents
    //read next token
    reader.readNext();
    while (!reader.atEnd()) {
        if (reader.isStartElement()) {
            if (reader.name() == "chapter") {
                readXmlTokens();
            }
            else {
                reader.raiseError(QObject::tr("Not a chapter index file"));
            }
        }
        else {
            reader.readNext();
        }
    }

    file.close();
}
//read xml tokens
void ContentsTextBrowser::readXmlTokens()
{
    reader.readNext();
    while (!reader.atEnd()) {
        if (reader.isEndElement()) {
            reader.readNext();
            break;
        }
        if (reader.isStartElement()) {
            if (reader.name() == "content") {
                loadXxFiles();
            }
            else if(reader.name() == "image") {
                loadImages();
            }
            else{
                skipUnknownElement();
            }
        } else {
            reader.readNext();
        }
    }
}
//load (.ds)files in xml files
void ContentsTextBrowser::loadXxFiles()
{
    QString fileName;
    fileName = reader.attributes().value("term").toString();
    readXxFiles(fileName);

    readXmlTokens();
}
//load images in xml files
void ContentsTextBrowser::loadImages()
{
    QString fileName;
    fileName = "";

    append(fileName);

    readXmlTokens();
}
//skip unknownElement
void ContentsTextBrowser::skipUnknownElement()
{
    reader.readNext();
    while (!reader.atEnd()) {
        if (reader.isEndElement()) {
            reader.readNext();
            break;
        }

        if (reader.isStartElement()) {
            skipUnknownElement();
        } else {
            reader.readNext();
        }
    }
}

 

你可能感兴趣的:(Qt)