XML语言数据读写理解3

mac2023-01-22  30

首先先把我们要读取的xml文件搞上来:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Appearance> <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>

我们简单看一下用浏览器显示的这个数据的结构:

    可以说这个XML的层次以及较为复杂了,已经比得上很多应用程序的数据结构复杂度了,那么我们就尝试一点一点将这个程序解析出来。注意第二行的<!DOCTYPE Appearance>。与设置显示有关,这里就懒得处理了。不用管它,删掉也行。

    首先,排除掉上一节讲的前两行,然后我们看到了一个ROOT节点,要注意的是,任何XML文件的根节点只能有一个!!也就是说,如果你这么写:

<ROOT> <Mode> ...... </Mode> </Mode2> ...... </Mode2> </ROOT> <ROOT2> <Mode3> ...... </Mode3> </Mode4> ...... </Mode4> </ROOT2>

    使用浏览器或者任何常规的解析器就会解析错误,因为没有根节点(如果最大范围的节点有两个,它就不再是根节点了,而是普通节点,例如ROOT 和 ROOT2,同为最大范围的节点,遍都不再是根节点了。)

    利用上一节我们的程序读取了前两行版本信息以后,使用下面的程序,

//读取根元素 QDomElement root = xml.documentElement(); dw->addContents("["+root.tagName()+"]"); dw->addContents("");//再隔开一行 //注意上一节提到过,dw->addContents(QString)是用来调试显示结果用的程序,每次调用都换一行显示

    显示结果为:

[ROOT]

    也就是说我们已经找到了根节点。接下来就可以找里面的子节点了。

    根据上图浏览器显示的结构,我们下一级的节点为Mode和Mode2,所以我们的目标就是要把这两个Mode提取出来。见程序:

    

QDomNode data = root.firstChild(); while (!data.isNull()) { QDomElement e = data.toElement(); // try to convert the node to an element. dw->addContents("[" + e.tagName() + "]"); //再去找下一个节点 data = data.nextSiblingElement(); }

    一看就知道,首先先把第一个子节点找出来,然后转为元素 (就是里面有数据的结构,当然这里的节点Mode和Mode2里面还是节点,所以并不算一个元素)。

    然后再把子节点的名字打印出来,然后转到下一个节点。最后的打印效果如下:

[Mode] [Mode2]

    到现在为止,我们写过的程序打印出来的总效果:

xml version='1.0' encoding='UTF-8' [ROOT] [Mode] [Mode2]

    这一节就先讲这么多,到下一节我再讲循环把所有的节点都打印出来。

最新回复(0)