zoukankan      html  css  js  c++  java
  • 40.DOM读取XML

    main.cpp

    #include <QtGui>
    #include <iostream>
    
    #include "domparser.h"
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        QDir::setCurrent(app.applicationDirPath());//设置路径为当前目录
    
    
        QStringList labels;
        labels << QObject::tr("Terms") << QObject::tr("Pages");
    
        QTreeWidget treeWidget;
        treeWidget.setHeaderLabels(labels);
        treeWidget.header()->setResizeMode(QHeaderView::Stretch);
        treeWidget.setWindowTitle(QObject::tr("DOM Parser"));
        treeWidget.show();
    
        DomParser parser(&treeWidget);
        parser.readFile("in1.xml");
    
        return app.exec();
    }

    DomPaser.h

    #ifndef DOMPARSER_H
    #define DOMPARSER_H
    
    class QDomElement;
    class QString;
    class QTreeWidget;
    class QTreeWidgetItem;
    
    class DomParser
    {
    public:
        DomParser(QTreeWidget *tree);
        //打开传递来的文件
        bool readFile(const QString &fileName);
    
    private:
        void parseBookindexElement(const QDomElement &element);
        void parseEntryElement(const QDomElement &element,
                               QTreeWidgetItem *parent);
        void parsePageElement(const QDomElement &element,
                              QTreeWidgetItem *parent);
    
        QTreeWidget *treeWidget;
    };
    
    #endif

    domparser.cpp

    #include <QtGui>
    #include <QtXml>
    #include <iostream>
    
    #include "domparser.h"
    
    DomParser::DomParser(QTreeWidget *tree)
    {
        treeWidget = tree;
    }
    
    //读文件
    bool DomParser::readFile(const QString &fileName)
    {
        QFile file(fileName);
        //判断是否打开成功
        if (!file.open(QFile::ReadOnly | QFile::Text)) {
            std::cerr << "Error: Cannot read file " << qPrintable(fileName)
                      << ": " << qPrintable(file.errorString())
                      << std::endl;
            return false;
        }
    
        //错误信息
        QString errorStr;
        //错误行
        int errorLine;
        //错误项
        int errorColumn;
    
        QDomDocument doc;
        //setContent解析XML文档,如果文档没打开,
        //setContent将自动打开,false参数将禁用命名空间的处理.
        if (!doc.setContent(&file, false, &errorStr, &errorLine,
                            &errorColumn)) {
            std::cerr << "Error: Parse error at line " << errorLine << ", "
                      << "column " << errorColumn << ": "
                      << qPrintable(errorStr) << std::endl;
            return false;
        }
    
        //如果解析成功,就对QDomDocument调用documentElement获取它唯一的
        //QDomElement子对象
        QDomElement root = doc.documentElement();
        //判断是否有<bookindex>元素,如果有就调用QDomElement来解析
        if (root.tagName() != "bookindex") {
            std::cerr << "Error: Not a bookindex file" << std::endl;
            return false;
        }
    
        parseBookindexElement(root);
        return true;
    }
    
    //遍历所有子节点
    void DomParser::parseBookindexElement(const QDomElement &element)
    {
        //发现下一个子对象
        QDomNode child = element.firstChild();
        //如果不为空
        while (!child.isNull()) {
            if (child.toElement().tagName() == "entry")
            {
                parseEntryElement(child.toElement(),
                                  treeWidget->invisibleRootItem());
            }
            child = child.nextSibling();
        }
    }
    
    //entry标签处理
    void DomParser::parseEntryElement(const QDomElement &element,
                                      QTreeWidgetItem *parent)
    {
        QTreeWidgetItem *item = new QTreeWidgetItem(parent);
        item->setText(0, element.attribute("term"));
    
        QDomNode child = element.firstChild();
        while (!child.isNull()) 
        {
            //如果是entry调用entry处理
            if (child.toElement().tagName() == "entry") 
            {
                parseEntryElement(child.toElement(), item);
            }
            //如果是page调用page处理
            else if (child.toElement().tagName() == "page") 
            {
                parsePageElement(child.toElement(), item);
            }
            //继续处理下一个
            child = child.nextSibling();
        }
    }
    
    //处理page项
    void DomParser::parsePageElement(const QDomElement &element,
                                     QTreeWidgetItem *parent)
    {
        QString page = element.text();
        QString allPages = parent->text(1);
        if (!allPages.isEmpty())
            allPages += ", ";
        allPages += page;
        parent->setText(1, allPages);
    }
  • 相关阅读:
    dataGridView不选中第一行第一列的办法!
    C#唯一随机数 和 PadLeft、PadRight 补足位数
    SSRS 数值和日期格式
    Oracle SQL*Loader
    找不到请求的 .Net Framework Data Provider。可能没有安装
    ORA00837: Specified value of MEMORY_TARGET greater than MEMORY_MAX_TARGET
    oracle临时表空间 ORA01652:无法通过16(在表空间XXX中)扩展 temp 字段
    ORACLE恢复删除表或表记录
    Spring.Net Resource handler for the 'web' protocol is not defined.
    ASP.NET MVC ueditor图片上传失败问题
  • 原文地址:https://www.cnblogs.com/xiaochi/p/9027564.html
Copyright © 2011-2022 走看看