XML语言数据读写理解10

209 阅读1分钟

我们上一节讲完了读出Nodes和其他属性信息的程序,接下来我们把两个Item读到group里面。

`#pragma once
#include <QObject>
#include "tsfunitem.hpp"

class TsfunGroup : public QObject {
        Q_OBJECT

public:
        TsfunGroup(QObject * parent = Q_NULLPTR);
        ~TsfunGroup();

        TsfunItemList tsfitmlist;
        QDomDocument xmlFile;
        void readXML(const QString& filename);

private:
        QString filename;

};`

注意 TsfunItemList 是前文定义的存放 TsfunItem 的列表。关键就是readMXL文件了:

`#include "tsfungroup.hpp"
#include "debugwidget.hpp"
TsfunGroup::TsfunGroup(QObject * parent) : QObject(parent) {

}

TsfunGroup::~TsfunGroup() {

}`

先把无关紧要的两个函数放进去,接下来是函数:

`void TsfunGroup::readXML(const QString& filename)
{

}`

为了看着更简洁,我们一段一段的解释程序:

`    DebugWidget *dw = new DebugWidget;
        QFile file("C:\\Developer\\Rendering\\Rendering\\XML\\transferfunction.xml");
        if (!file.open(QIODevice::ReadOnly))
                dw->addContents("error 1");
        if (!xmlFile.setContent(&file))
        {
                file.close();
                dw->addContents("error 2");
        }
        file.close();
        //这里有类似于version这样的第一个子节点信息。
        QDomNode firstChild = xmlFile.firstChild();
        if (firstChild.nodeName() == "xml") {
                dw->addContents(firstChild.nodeName());
                dw->addContents(firstChild.nodeValue());
        }
        else {
                dw->addContents("No version , No Format");
        }dw->addContents("");`
    

这一段其实也没有什么特别的,之前都讲过很多遍了。打印出来的效果如下:

xml version='1.0' encoding='UTF-8'

    之后我们读取根元素并打印:

`//读取根元素<TsfunGroup>
QDomElement root = xmlFile.documentElement();
dw->addContents("[" + root.tagName() + "]");
dw->addContents("");`

    这个之前也讲了很多遍了,综合打印效果如下:

`xml
version='1.0' encoding='UTF-8'

[TsfunGroup]


QDomNode TsfunItem1 = root.firstChild();
//dw->addContents(TsfunItem1.toElement().tagName());
while (!TsfunItem1.isNull())
{
        dw->addContents(TsfunItem1.toElement().tagName()+" "+ TsfunItem1.toElement().attribute("Name"));

        TsfunItem tsfunitemdata;
        tsfunitemdata.readTsfunItem(TsfunItem1.childNodes());
        tsfitmlist.append(tsfunitemdata);

        dw->addContents(QString::number(tsfunitemdata.returnNumOfNodes()));

        TsfunItem1 = TsfunItem1.nextSiblingElement();
}`

循环和以前套路差不多,区别就是直接在里面使用了readTsfunItem(TsfunItem1.childNodes()); ,它读取了TsfunItem1里面的数据,然后TsfunItem1迭代到下一个TsfunItem,之后再读出来。打印效果如下:

`xml
version='1.0' encoding='UTF-8'

[TsfunGroup]

TsfunItem normalMode
6
TsfunItem maxMode
6`

说明确实读出来了里面的6个元素,但是这6个元素到底对不对,我们还得想办法在输出中测验测验,鉴于这些变量都是私有的,我们要再添加一些接口,作为留给下一节的任务。