加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

TinyXML读取XML文件内容 [大三四八九月实习]

发布时间:2020-12-16 05:19:14 所属栏目:百科 来源:网络整理
导读:1 XML文件的节点与元素 为什么要探讨这个问题呢,因为在 TinyXML 类的成员函数中,有指向下一个结点的成员函数 ( NextSibling ) 有指向下一个元素的成员函数 ( NextSiblingElement ) ,元素在 XML 文件基本结构中基本已经形成概念,现在又冒出一个结点。还有

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]两点将ValueText读取出来:

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代码读取了,不然会有意外的错误。

读取结果:

Figure2:读取的XML文件内容

此次笔记记录完毕。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读