Top
分享一个XML解析库 -- TinyXML_C/C++代码_BlackFeather'S Blog
忙忙碌碌,更新不及时诶。

分享一个XML解析库 -- TinyXML

C/C++代码 blackfeather 679

 

解析XML很常见的功能,网上库也很多,有的大有的小,有的用起来方便有的繁琐。博主测试了几个库,最后用这了这个库,分享出来。

 

TinyXML,能百度到很多使用的demo代码,用起来确实很方便,我附件里面的是单文件版,只有一个.hpp(就是.h),直接include后就能使用。

 

点击下载:tinyXML.hpp.gz

 

顺便贴一个很好的使用实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
void dump_to_stdout( TiXmlNode* pParent )//Tixml主页上给的一个遍历方法   
{   
        if ( !pParent ) return;   
    
        TiXmlNode* pChild;   
        TiXmlText* pText;   
        int t = pParent->Type();   
        printf"type %d/n", t);   
        int num;   
    
        switch ( t )   
        {   
        case TiXmlNode::DOCUMENT:   
               printf"Document" );   
                break;   
    
        case TiXmlNode::ELEMENT:   
                printf"Element [%s]", pParent->Value() );   
               num=dump_attribs_to_stdout(pParent->ToElement(), indent+1);   
                switch(num)   
                {   
                        case 0:  printf" (No attributes)"); break;   
                        case 1:  printf"%s1 attribute", getIndentAlt(indent)); break;   
                        defaultprintf"%s%d attributes", getIndentAlt(indent), num); break;   
                }   
                break;   
    
        case TiXmlNode::COMMENT:   
               printf"Comment: [%s]", pParent->Value());   
                break;   
    
        case TiXmlNode::UNKNOWN:   
                printf"Unknown" );   
                break;   
    
        case TiXmlNode::TEXT:   
               pText = pParent->ToText();   
                printf"Text: [%s]", pText->Value() );   
                break;   
    
        case TiXmlNode::DECLARATION:   
                printf"Declaration" );   
                break;   
        default:   
                break;   
        }   
        printf"/n" );   
        for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())    
        {   
                dump_to_stdout( pChild );   
        }   
}   
void search(TiXmlNode* pParent)//遍历时候,把每个节点都是做一个父节点,即假定其都有子节点ChildNode   
{   
       if ( !pParent ) return;   
           
       TiXmlNode* pChild= NULL;   
           int t = pParent->Type();//获取此节点的类型   
    
       if (TiXmlNode::ELEMENT == t && (strcmp("Welcome",pParent->Value()) == 0))//搜索元素值为"Welcome"的   
        {   
           printf("value %s/n",pParent->Value());//打印值   
           pParent->SetValue("re-write");//改变其属性   
           pParent->ToElement()->SetAttribute("hello",20);   
    
           TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );//添加一个节点   
               element1->SetAttribute("num",5);   
               pParent->LinkEndChild(element1);   
    
           pDoc->SaveFile(); //保存文件                 
        }   
    printf"/n" );   
    for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())    
        {   
            search(pChild);   
    }   
          
}   
void search2(TiXmlNode* pParent)//另一种方法:   
{   
       if ( !pParent ) return;   
           
       TiXmlNode* pChild= NULL;   
       TiXmlNode*tmp = NULL;   
           int t = pParent->Type();   
    
       tmp = pParent->FirstChild("Window");//搜索元素值为"Window"的节点   
       if(tmp){   
            
      //pParent->RemoveChild(tmp);//找到后删除此节点   
                
       TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );   
           element1->SetAttribute("num",5);   
    
       pParent->ReplaceChild(tmp,*element1);//找到"AMULE_ToDL"节点后替换此节点   
           
       }   
    
       pDoc->SaveFile(); //保存文件                  
            
    printf"/n" );   
    for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) //遍历一个节点的所兄弟节点,记着单词sibling是兄弟, 姐妹的意思   
                                                                                                                                //也就是说FirstChild()和NextSibling()不是 父节点和子节点的关系   
    {   
            search2(pChild);//遍历一个节点的所有子节点   
    }   
          
}


 

评论列表:

发表评论:

验证码