1 XML文件的节点与元素
为什么要探讨这个问题呢,因为在TinyXML类的成员函数中,有指向下一个结点的成员函数(NextSibling)有指向下一个元素的成员函数(NextSiblingElement),元素在XML文件基本结构中基本已经形成概念,现在又冒出一个结点。还有的就是我们要访问的内容在TinyXML类中叫什么名字,用什么方法来访问?这个都是需要验证一下子的。
关于节点和元素的问题还是借助于[http://www.w3school.com.cn/xmldom/dom_nodes.asp]文章[ 不要细看XML代码,看代码后面的解说 ]:
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book category="children"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="web"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> <book category="web"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book> </bookstore>
在上面的 XML 中,根节点是 <bookstore>。文档中的所有其他节点都被包含在 <bookstore>中。
根节点 <bookstore>有四个 <book>节点。
第一个<book>节点有四个节点:<title>,<author>,<year>以及<price>,其中每个节点都包含一个文本节点,"Harry Potter","J K. Rowling","2005"以及 "29.99"。
文本总是存储在文本节点中
在 DOM处理中一个普遍的错误是,认为元素节点包含文本。
不过,元素节点的文本是存储在文本节点中的。
在这个例子中:<year>2005</year>,元素节点 <year>,拥有一个值为"2005"的文本节点。
"2005"不是 <year> 元素的值!
2 TinyXML读取XML文件中的内容实例
(1)总结
验证一下XML文件中的每个部分到底叫什么名字,在TinyXML中用什么方法访问,及每个函数对应的XML文件结构。
Figure1:简单的XML与TinyXML方法对应
经过程序验证,得出以上XML文件对应TinyXML中的方法为:
[1] <ChildStation>:是整个文档的根元素(也是根节点),用TiXmlDocument:: RootElement()方法得到指向此元素(节点的指针),得到指向此根元素的指针之后,<ChildStation>中的“ChildStation”叫做Value,可以用TiXmlDocument:: RootElement()->Value();将其输出到屏幕中。
[2]<Name> …</Name>及<Address>…</Address >属于<ChildStation>的子元素(子结点),可以通过根元素利用FirstChildElement()获得]<ChildStation>下的第一个子元素,然后通过此子元素用NextSibliingElement()方法获得下一个跟<Name>处于同一级别( 属于<ChildStation>第二个子元素)的指针,一次类推。获取每个元素的文本内容用的是GetText()方法,通过此方法就能够获得以上“STM100”、“0001”等内容。
这样就能够读取每个元素下“<>”及“<>”与“</>”之间的内容。
对于层次一样的元素点,用NextSibliingElement()方法获取下一个元素点,如果是获取此元素的子元素点,则利用FirstChildElement()方法先获取第一个子元素点,子元素点之间再用NextSibliingElement()方法来获取下一个同层次的元素点。 |
只要访问到一个元素“<>…</>”利用[1][2]就可以访问到所有的内容,似乎足矣。
(2)读取实例
针对以上的XML文本,可以用以上总结的[1][2]两点将Value和Text读取出来:
void MyTinyXML::select_node( ) { //Get the root element pDoc->LoadFile(); pRootElement = pDoc->RootElement(); cout << " \nroot value:" << pRootElement->Value(); cout << " \nroot text:" << pRootElement->GetText(); TiXmlElement *pCurrentElement = NULL; //Go in to root's child element pCurrentElement = pRootElement->FirstChildElement(); while( pCurrentElement ) { //Print value cout << "\child value:"<< pCurrentElement->Value(); //Print text //cout << "\child text:"<< pCurrentElement->GetText(); //Next child element pCurrentElement = pCurrentElement->NextSiblingElement(); } if ( pCurrentElement ) { delete pCurrentElement; pCurrentElement = NULL; } }
说明:不见定义的都是类中的私有成员。
对于XML中没有的内容就不要用TinyXML代码读取了,不然会有意外的错误。
读取结果:
此次笔记记录完毕。