QTDom读取XML文档

    xiaoxiao2021-03-26  33

    (同流处理)声明

    QT += core gui xml

    方法:

    public: MainWindow(QWidget *parent = 0); ~MainWindow(); 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;

    读取文件放入内存中 1.QDomDocument::setContent()方法 声明dom 将文档数据放入内存中 2.获取根节点 QDomElement root = doc.documentElement(); 3.进入bookindex方法

    bool MainWindow::readFile(const QString &fileName) { QFile file(fileName); if (!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::critical(this, tr("Error"),tr("Cannot read file %1").arg(fileName)); return false; } QString errorStr; int errorLine; int errorColumn; //重写QDomDocument::setContent()方法 声明dom 将文档数据放入内存中 //第一个是QByteArray,也就是所读取的真实数据,由QIODevice即可获得这个数据,QFile是QIODevice的子类,即Qfile读取数据 //第二个参数确定是否处理命名空间,如果设置为 true,处理器会自动设置标签的前缀之类,因为我们的 XML 文档没有命名空间,所以直接设置为 false //剩下的三个参数都是关于错误处理。后三个参数都是输出参数,我们传入一个指针,函数会设置指针的实际值,以便我们在外面获取并进行进一步处理。 QDomDocument doc; if (!doc.setContent(&file, false, &errorStr, &errorLine,&errorColumn)) { QMessageBox::critical(this, tr("Error"), tr("Parse error at line %1, column %2: %3") .arg(errorLine).arg(errorColumn).arg(errorStr)); return false; } //获取根节点 QDomElement root = doc.documentElement(); //根节点标签名 if (root.tagName() != "bookindex") { QMessageBox::critical(this, tr("Error"),tr("Not a bookindex file")); return false; } parseBookindexElement(root); return true; }

    parseBookindexElement方法

    void MainWindow::parseBookindexElement(const QDomElement &element) { //取第一个子节点(父节点为bookindex) QDomNode child = element.firstChild(); //子节点不为空. while (!child.isNull()) { //判断子节点child是否为entry if (child.toElement().tagName() == "entry") { parseEntryElement(child.toElement(), treeWidget->invisibleRootItem()); } //QDomNode::nextSibling() 指向下一个child child = child.nextSibling(); } }

    parseEntryElement方法

    void MainWindow::parseEntryElement(const QDomElement &element, QTreeWidgetItem *parent) { QTreeWidgetItem *item = new QTreeWidgetItem(parent); //QString QDomElement::attribute(const QString &name, // const QString &defValue = QString()) const item->setText(0, element.attribute("term")); //此时element为entry QDomNode child = element.firstChild(); //判断child不为空 while (!child.isNull()) { if (child.toElement().tagName() == "entry") { parseEntryElement(child.toElement(), item); } else if (child.toElement().tagName() == "page") { parsePageElement(child.toElement(), item); } child = child.nextSibling(); } }

    parsePageElement方法

    void MainWindow::parsePageElement(const QDomElement &element, QTreeWidgetItem *parent) { //此时element为page 获取element文本 QString page = element.text(); //设置TreewidgetItem文本 QString allPages = parent->text(1); if (!allPages.isEmpty()) { allPages += ", "; } allPages += page; parent->setText(1, allPages); }
    转载请注明原文地址: https://ju.6miu.com/read-662922.html

    最新回复(0)