QT Dom读取XML文档

(同流处理)声明

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);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值