最后就是在tsfunGroup类里面定义函数:
void writeXML();
因为不再需要什么返回值了。源码如下:
void TsfunGroup::writeXML() {
writeFile.clear();
QDomProcessingInstruction instruction = writeFile.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
writeFile.appendChild(instruction);
QDomElement root = writeFile.documentElement();
root = writeFile.createElement("TsfunGroup");
writeFile.appendChild(root);
DebugWidget::getDebugWidget()->addContents(QString::number(tsfitmlist.count()));
for (int i = 0;i < tsfitmlist.count();i++) {
root.appendChild(tsfitmlist[i].writeTsfunItem(writeFile));
}
QString fileName{ "C:\\Developer\\Rendering\\Rendering\\XML\\bbescat.xml" };
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
}
//输出到文件
QTextStream out_stream(&file);
writeFile.save(out_stream, 4); //缩进4格
file.close();
}
由于这个结构设计的还不错,所以现在这个代码写起来也不是很费劲。前面还和以前一样。为了方便我就直接把 "version=\"1.0\" encoding=\"UTF-8\" "作为参数来创建了。其实这句话一般也用不着。
之后就是常规的创建根节点,创建子节点之类的。在循环中我们调用了上层的函数。
最后,创建文件,然后写入,保存。
要注意的是我们生成的文件所用到的所有数据与读xml文件的对象xmlFile是一点关系都没有的,因为我们是直接用数据来创建的xml文件。这和直接用读取的xml文件是有本质区别的。
做到这里,整个读写的程序就已经基本结束了。在接下来讲实现自由添加或者删除节点的功能之前,我们再回过头来回顾一下整个工程:
首先,我们根据整个文件的结构设计了最底层的Nodets来存储三个最底层的节点和属性:
<NormalizedIntensity Value="0"/>
<Opacity Value="0"/>
<Emission G="0" R="0" B="0"/>
之后,针对上一级的节点,我们设置了 tsfunItem来存储每一个 TsfunItem
<TsfunItem Name="normalMode">
<Nodes>
</Nodes>
<DensityScale Value="100"/>
<ShadingType Value="2"/>
<GradientFactor Value="3"/>
</TsfunItem>
然后又设计了group来存储每个tsfunItem。
<?xml version="1.0" encoding="UTF-8"?>
<TsfunGroup>
<TsfunItem Name="normalMode">
</TsfunItem>
<TsfunItem Name="maxMode">
</TsfunItem>
</TsfunGroup>
读取也是同样的设计顺序,先把Nodets里面的数据构建节点,生成DomElement的对象。
然后再实现上一级的DomElement对象。
最后再加入根节点,构建整个XML类,最后将整个类进行输出到文件中。
下一节我们再讲如何把数据构成节点,然后添加到xml结构里。