tinyXML handle

在TinyXML中,根据XML的各种元素来定义了一些类:
        TiXmlBase:整个TinyXML模型的基类。
        TiXmlAttribute:对应于XML中的元素的属性。
        TiXmlNode:对应于DOM结构中的节点。
        TiXmlComment:对应于XML中的注释。
        TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
        TiXmlDocument:对应于XML的整个文档。
        TiXmlElement:对应于XML的元素。
        TiXmlText:对应于XML的文字部分。
        TiXmlUnknown:对应于XML的未知部分。 

        TiXmlHandler:定义了针对XML的一些操作。

例如:

<? xml version="1.0" standalone=no>
<!– Our to do list data –>
<ToDo>
<Item priority="1"> Go to the <bold>Toy store!</bold></Item>
<Item priority="2"> Do bills</Item>
</ToDo> 

整个对象树: 

TiXmlDocument "demo.xml"
TiXmlDeclaration "version=’1.0′" "standalone=no"
TiXmlComment " Our to do list data"
TiXmlElement "ToDo"
TiXmlElement "Item" Attribtutes: priority = 1
TiXmlText "Go to the "
TiXmlElement "bold"
TiXmlText "Toy store!"
TiXmlElement "Item" Attributes: priority=2
TiXmlText "Do bills" 

tinyXML中,用FirstChild"名字"时,FirstChild函数的点与要找的点必父子

句柄

想要健壮地读取一个XML文档,检查方法调用后的返回值是否为null是很重要的。一种安全的检错实现可能会产生像这样的代码:

复制代码
TiXmlElement* root = document.FirstChildElement( "Document" );
if ( root )
{
TiXmlElement
* element = root->FirstChildElement( "Element" );
if ( element )
{
TiXmlElement
* child = element->FirstChildElement( "Child" );
if ( child )
{
TiXmlElement
* child2 = child->NextSiblingElement( "Child" );
if ( child2 )
{
// Finally do something useful. 
复制代码

用句柄的话就不会这么冗长了,使用TiXmlHandle类,前面的代码就会变成这样: 

TiXmlHandle docHandle( & document );
TiXmlElement
*  child2  =  docHandle.FirstChild(  " Document "  ).FirstChild(  " Element "  ).Child(  " Child " 1  ).ToElement();
if  ( child2 )
{
//  do something useful 
}

2.读取XML文件

 如读取文件a.xml:

复制代码
<ToDo>
    <Item priority="1"> 
        <bold>
            Book store!
        </bold>
    </Item>
    <Item priority="2"> 
        book1
    </Item>
    <Item priority="2"> 
        book2
    </Item>
</ToDo>
复制代码

读取代码如下:

复制代码
 1 #include "tinyxml.h"
 2 #include <iostream>
 3 #include <string>
 4 
 5 using namespace std;
 6 
 7 enum SuccessEnum {FAILURE, SUCCESS};
 8 
 9 SuccessEnum loadXML()
10 {
11     TiXmlDocument doc;
12     if(!doc.LoadFile("a.xml"))
13     {
14         cerr << doc.ErrorDesc() << endl;
15         return FAILURE;
16     }
17 
18     TiXmlElement* root = doc.FirstChildElement();
19     if(root == NULL)
20     {
21         cerr << "Failed to load file: No root element." << endl;
22         doc.Clear();
23         return FAILURE;
24     }
25 
26     for(TiXmlElement* elem = root->FirstChildElement(); elem != NULL; elem = elem->NextSiblingElement())
27     {
28         string elemName = elem->Value();
29         const char* attr;
30         attr = elem->Attribute("priority");
31         if(strcmp(attr,"1")==0)
32         {
33             TiXmlElement* e1 = elem->FirstChildElement("bold");
34             TiXmlNode* e2=e1->FirstChild();
35             cout<<"priority=1\t"<<e2->ToText()->Value()<<endl;
36 
37         }
38         else if(strcmp(attr,"2")==0)
39         {
40             TiXmlNode* e1 = elem->FirstChild();
41             cout<<"priority=2\t"<<e1->ToText()->Value()<<endl;
42         }
43     }
44     doc.Clear();
45     return SUCCESS;
46 }
47 
48 int main(int argc, char* argv[])
49 {
50     if(loadXML() == FAILURE)
51         return 1;
52     return 0;
53 }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值