XML语言数据读写理解12

287 阅读2分钟

首先我们从最底层的Nodets开始写起,然后逐步往上层实现。

在类里面定义一个函数:

QDomElement writeNodets(QDomDocument &doc);

注意参数是QDomDocument,因为你要靠这个参数来创建节点元素。

下面把函数附上:

`QDomElement NodeTS::writeNodets(QDomDocument &doc)
{
        QDomElement NormalizedIntensityNode = doc.documentElement();
        NormalizedIntensityNode = doc.createElement("NormalizedIntensity");
        NormalizedIntensityNode.setAttribute("Value", NormalizedIntensity);
        QDomElement OpacityNode = doc.documentElement();
        OpacityNode = doc.createElement("Opacity");
        OpacityNode.setAttribute("Value",Opacity);
        QDomElement EmissionNode = doc.documentElement();
        EmissionNode = doc.createElement("Emission");
        EmissionNode.setAttribute("G", Emission.green());
        EmissionNode.setAttribute("R", Emission.red());
        EmissionNode.setAttribute("B", Emission.blue());
        QDomElement ccNode = doc.documentElement();
        ccNode = doc.createElement("Node");
        ccNode.appendChild(NormalizedIntensityNode);
        ccNode.appendChild(OpacityNode);
        ccNode.appendChild(EmissionNode);
        return ccNode;
}`

其实跟之前的文件读写没有什么区别。我们创建每个元素,然后给它添加属性和属性值,然后归到一个节点里,最后作为返回值返回。如果读了博客前几章,一定就对这个很熟悉了。其实最近这几节的内容并没有什么新的知识,只是要求读者更加熟悉xml文件的结构以及对这种结构我们设计自己的类,然后并进行读写。设计的难度主要是在于层层递进性。

我们再进入到上一层,即使用tsfunItem来获取nodets的内容。我们定义一个函数:

`QDomElement writeTsfunItem(QDomDocument &doc);
QDomElement TsfunItem::writeTsfunItem(QDomDocument &doc)
{
        QDomElement DensityScaleElement = doc.documentElement();
        DensityScaleElement = doc.createElement("DensityScale");
        DensityScaleElement.setAttribute("Value", DensityScale);
        QDomElement ShadingTypeElement =  doc.documentElement();
        ShadingTypeElement = doc.createElement("ShadingType");
        ShadingTypeElement.setAttribute("Value", ShadingType);
        QDomElement GradientFactorElement = doc.documentElement();
        GradientFactorElement = doc.createElement("GradientFactor");
        GradientFactorElement.setAttribute("Value", GradientFactor);

        QDomElement TsNodesElement = doc.documentElement();
        TsNodesElement = doc.createElement("Nodes");

        //DebugWidget::getDebugWidget()->addContents(QString::number(TsNodes.count()));
        for (int i = 0;i < TsNodes.count();i++) {
                TsNodesElement.appendChild(TsNodes[i].writeNodets(doc));

        }
        QDomElement itemNodes = doc.documentElement();
        itemNodes = doc.createElement("TsfunItem");
        itemNodes.setAttribute("Name", NameID);
        itemNodes.appendChild(TsNodesElement);
        itemNodes.appendChild(DensityScaleElement);
        itemNodes.appendChild(ShadingTypeElement);
        itemNodes.appendChild(GradientFactorElement);

        return itemNodes;
}`

注意到在Nodes节点获取子节点的过程中我们就使用了上面刚设计好的TsNodes[i].writeNodets(doc);函数,在这里还是有很多与之前重复的内容,但是结构貌似越来越复杂了。在我完成整个读写的讲解以后,以及在实现节点某个的添加和删除程序之前,我会把整体的设计思路再给大家讲解一遍,以保证大家能够更好地理解我们的设计思路。下一节我们完成整个写文件的程序。