利用 Qt 读取 XML 文件的方法

前端之家收集整理的这篇文章主要介绍了利用 Qt 读取 XML 文件的方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

XML是可扩展标记语言(ExtensibleMarkupLanguage)的缩写。XML文件内容标记组成,通过以标记包围内容的方式将大部分内容包含在元素中。

Qt中提供了多种读取XML文件方法,这里简单的记录一下用QDomDocument读取的步骤。为什么使用QDomDocument呢,因为XML本身就是一以树状结构组织数据的,而DOM也是将数据组织为树状结构,最适合直观地展示XML数据。

下面的代码Qt帮助文件自带的例子代码

QDomDocument doc("mydocument");
QFile file("mydocument.xml");
if (!file.open(QIODevice::ReadOnly))
    return;
if (!doc.setContent(&file))
{
    file.close();
    return;
}
file.close();

// print out the element names of all elements that are direct children
// of the outermost element.
QDomElement docElem = doc.documentElement();

QDomNode n = docElem.firstChild();
while (!n.isNull())
{
    QDomElement e = n.toElement(); // try to convert the node to an element.
    if (!e.isNull())    
	{
        cout << qPrintable(e.tagName()) << endl; // the node really is an element.
    }
    n = n.nextSibling();

}

如果xml有多层,那么可以递归的去读取。我写了小程序xml的的数据读入到一个树型列表控件中。下面是核心的代码

#ifndef DIALOG_H
#define DIALOG_H
#include <QtXml>
#include <QDialog>

namespace Ui {
class Dialog;
}
class QTreeWidgetItem;
class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    void listDom(QDomElement& docElem,QTreeWidgetItem* pItem);
    void openXML(QString fileName);
    ~Dialog();

private:
    Ui::Dialog *ui;
private slots:
    void openFile();
};

#endif // DIALOG_H

#include "dialog.h"
#include "ui_dialog.h"
#include <QFileDialog>
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),ui(new Ui::Dialog)
{
    ui->setupUi(this);
    connect(ui->pushButtonOpen,SIGNAL(clicked()),this,SLOT(openFile()));
    ui->treeWidget->setColumnCount(2);
    ui->treeWidget->setColumnWidth(0,400);
    setWindowFlags(Qt::Dialog | Qt::WindowMaximizeButtonHint | Qt::WindowMinimizeButtonHint);
    showMaximized();
}
void Dialog::openXML(QString fileName)
{
    QFile file(fileName);
    if(file.open(QIODevice::ReadOnly))
    {
        QDomDocument dom("WCM");
        if (dom.setContent(&file))
        {
            ui->treeWidget->clear();
            QDomElement docElem = dom.documentElement();
            listDom(docElem,NULL);
        }
    }
    file.close();
}

void Dialog::openFile()
{
    QString fileName = QFileDialog::getOpenFileName(this,tr("Open XML File"),"c:/",tr("XML Files (*.xml)"));
    if(!fileName.isEmpty())
    {
        openXML( fileName );
    }
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::listDom(QDomElement& docElem,QTreeWidgetItem * pItem)
{
    QDomNode node = docElem.firstChild();
    if(node.toElement().isNull())
    {
        pItem->setText (1,docElem.text());
    }
    while(!node.isNull())
    {
        QDomElement element = node.toElement(); // try to convert the node to an element.
        if( !element.isNull() )
        {
            QTreeWidgetItem *item;
            if( pItem )
            {
                item = new QTreeWidgetItem(pItem);
            }
            else
            {
                item = new QTreeWidgetItem(ui->treeWidget);
            }
            item->setText(0,element.tagName());
            listDom(element,item);
            if( pItem )
            {
                pItem->addChild(item);
            }
            else
            {
                ui->treeWidget->addTopLevelItem(item);
            }
        }

        node = node.nextSibling();
    }
    return;
}

下面是个测试xml文件

<?xml version="1.0" encoding="UTF-8"?>
<recipe type="dessert">
	<recipename cuisine="american" servings="1">Ice Cream Sundae</recipename>
	<ingredlist>
		<listitem>
			<quantity units="cups">0.5</quantity>
			<itemdescription>vanilla ice cream</itemdescription>
		</listitem>
		<listitem>
			<quantity units="tablespoons">3</quantity>
			<itemdescription>chocolate syrup or chocolate fudge</itemdescription>
		</listitem>
		<listitem>
			<quantity units="tablespoons">1</quantity>
			<itemdescription>nuts</itemdescription>
		</listitem>
		<listitem>
			<quantity units="each">1</quantity>
			<itemdescription>cherry</itemdescription>
		</listitem>
	</ingredlist>
	<utensils>
		<listitem>
			<quantity units="each">1</quantity>
			<utensilname>bowl</utensilname>
		</listitem>
		<listitem>
			<quantity units="each">1</quantity>
			<utensilname>spoons</utensilname>
		</listitem>
		<listitem>
			<quantity units="each">1</quantity>
			<utensilname>ice cream scoop</utensilname>
		</listitem>
	</utensils>
	<directions>
		<step>Using ice cream scoop,place vanilla ice cream into bowl.</step>
		<step>Drizzle chocolate syrup or chocolate fudge over the ice cream.</step>
		<step>Sprinkle nuts over the mound of chocolate and ice cream.</step>
		<step>Place cherry on top of mound with stem pointing upward.</step>
		<step>Serve.</step>
	</directions>
	<variations>
		<option>Replace nuts with raisins.</option>
		<option>Use chocolate ice cream instead of vanilla ice cream.</option>
	</variations>
	<preptime>5 minutes</preptime>
</recipe>


下面是软件界面:

猜你在找的XML相关文章