XML语言数据读写理解5
现在我们再讲一下应该怎么把数据写成XML文件。
还是以例子入手,假设我们已经有了前面章节例子的数据,这一节我们考虑怎么把这些数据按照xml文件格式写入到xml文件里面。
首先列一下我们需要写入的数据:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<Mode>
<firstEle>
<A id = "1">
<T param1="42323" param2="2356" param3= "3d2"/>
<R param1="6256" param2="23562" param3= "f232f"/>
</A> <!-- childNode.nextSibling() 寻找下一个兄弟节点 -->
<A id = "2">
<R param1="433f3f" param2="frsfs" param3= "f2g34g"/>
<R param1="243442" param2="324232" param3= "j665"/>
</A>
<B id = "3">
<B param1="sdfsdfs" param2="fef2" param3= "43tg"/>
<W param1="123123" param2="32ff" param3= "efea"/>
</B>
</firstEle>
<secondEle>
<C id = "4">
<B param1="143221" param2="kyr5y" param3= "fwf"/>
<B param1="124531" param2="4g4gs" param3= "4w4g"/>
</C>
<D id = "5">
<B param1="13231233" param2="3qfgg" param3= "44444tw"/>
<B param1="45435" param2="aacevev" param3= "dghh"/>
</D>
</secondEle>
</Mode>
<Mode2>
<firstEle2>
<A id = "1">
<T param1="42323" param2="2356" param3= "3d2"/>
<R param1="6256" param2="23562" param3= "f232f"/>
</A> <!-- childNode.nextSibling() 寻找下一个兄弟节点 -->
<A id = "2">
<R param1="433f3f" param2="frsfs" param3= "f2g34g"/>
<R param1="243442" param2="324232" param3= "j665"/>
</A>
<B id = "3">
<B param1="sdfsdfs" param2="fef2" param3= "43tg"/>
<W param1="123123" param2="32ff" param3= "efea"/>
</B>
</firstEle2>
<secondEle2>
<C id = "4">
<B param1="143221" param2="kyr5y" param3= "fwf"/>
<B param1="124531" param2="4g4gs" param3= "4w4g"/>
</C>
<D id = "5">
<B param1="13231233" param2="3qfgg" param3= "44444tw"/>
<B param1="45435" param2="aacevev" param3= "dghh"/>
</D>
</secondEle2>
</Mode2>
</ROOT>
写入的第一件事:打开文件。
QString fileName{ "Motor.xml" };
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug() << "open for add error!!";
}
//输出到文件
QTextStream out_stream(&file);
out_stream<<"It is a test. ";
file.close();
运行以后打开文件,里面出现了It is a test. 的字样,表示文件成功打开了。
接下来就是创建XML的数据结构了:
//打开或创建文件
QString fileName{ "Motor.xml" };
QFile file(fileName);
QDomDocument doc;
QDomProcessingInstruction instruction = doc.createProcessingInstruction("xml",
"version=\"1.0\" encoding=\"UTF-8\"");
doc.appendChild(instruction);
/**以后内容都在这里逐步补全**/
//输出到文件
QTextStream out_stream(&file);
doc.save(out_stream, 4); //缩进4格
file.close();
首先创建一个fileName文件,然后使用QDomDocument 创建一个对象,接下来就很简单明白了,注意要把instruction加入到doc的子节点里面。否则啥也不会输出到文件里去。
输入结果如下:
<?xml version="1.0" encoding="UTF-8"?>
之后我们要把根节点加进去:
QDomElement root = doc.documentElement();
root = doc.createElement("ROOT");
doc.appendChild(root);
注意这里的root是一个QDomElement元素,直接加到了doc的子节点里,这时候文件输出如下:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT/>
要注意的是,这个<Mode/>和</Mode>可不是同一个东西!<Mode/>展开就可以写作<Mode></Mode>。如果我们强行加了两个根节点进去,虽然输出没有问题,但是用浏览器等打开是会有问题的。
<?xml version="1.0" encoding="UTF-8"?>
<ROOT/>
<ROOT2/>
再在下面写入:
QDomElement mode = doc.documentElement();
mode = doc.createElement("Mode");
QDomElement mode2 = doc.documentElement();
mode2 = doc.createElement("Mode2");
root.appendChild(mode);
root.appendChild(mode2);
和上面类似,只不过我们是把mode加入到了root的子节点里,效果显示如下:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<Mode/>
<Mode2/>
</ROOT>
之后,我们要在Mode里添加子节点。程序以及显示效果如下:
QDomElement firstEle = doc.documentElement();
firstEle = doc.createElement("firstEle");
QDomElement secondEle = doc.documentElement();
secondEle = doc.createElement("secondEle");
QDomElement firstEle2 = doc.documentElement();
firstEle2 = doc.createElement("firstEle2");
QDomElement secondEle2 = doc.documentElement();
secondEle2 = doc.createElement("secondEle2");
mode.appendChild(firstEle);
mode.appendChild(secondEle);
mode2.appendChild(firstEle2);
mode2.appendChild(secondEle2);
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<Mode>
<firstEle/>
<secondEle/>
</Mode>
<Mode2>
<firstEle2/>
<secondEle2/>
</Mode2>
</ROOT>
可以看到结构已经基本成型了,接下来就是最后的数据填充了。下一节我们再介绍。