TinyXMLの簡単な生成と解析の例

7360 ワード

#include 
#include 
using namespace std;

#include "../tinyxml/tinyxml.h"

int test1()
{
	TiXmlDocument xml_doc;
	/*  */
	//a
	TiXmlElement* xmlElemA = new TiXmlElement("A");
	TiXmlText* xmlTextA = new TiXmlText("a");
	xmlElemA->LinkEndChild(xmlTextA);

	//b
	TiXmlElement* xmlElemB = new TiXmlElement("B");
	TiXmlText* xmlTextB = new TiXmlText("b");
	xmlElemB->LinkEndChild(xmlTextB);

	//c
	TiXmlElement* xmlElemC = new TiXmlElement("C");
	TiXmlText* xmlTextC = new TiXmlText("c");
	xmlElemC->LinkEndChild(xmlTextC);

	xml_doc.LinkEndChild(xmlElemA);
	xml_doc.LinkEndChild(xmlElemB);
	xml_doc.LinkEndChild(xmlElemC);

	//      	
	xml_doc.SaveFile("abc.xml");
	
	
	/*  */
	//      
	TiXmlDocument xml_doc2;
	if (!xml_doc2.LoadFile("abc.xml"))
	{
		return -1;
	}

	TiXmlNode* node1 = xml_doc2.FirstChild("A");
	TiXmlNode* node2 = xml_doc2.FirstChild("B");
	TiXmlNode* node3 = xml_doc2.FirstChild("C");

	cout << "node1: " << *node1 << endl;
	cout << "node2: " << *node2 << endl;
	cout << "node3: " << *node3 << endl;
	
	return 0;
}


int main()
{

	test1();
	return 0;
}

生成されたXMLファイルは次のとおりです.
a
b
c

一般的な操作:
#include "tinyxml.h"
#include 
using namespace std;
 
TiXmlDocument *pDoc =NULL;
void write_xml( )/* XMl     */
    {
 
        TiXmlDocument doc;
        TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
        doc.LinkEndChild( decl );
 
        TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );//    element1
        element1->SetAttribute("num",5);
        doc.LinkEndChild( element1 );
//      TiXmlText * text = new TiXmlText( "World" );//      
//      element->LinkEndChild( text );//  
 
 
        TiXmlElement * element11 = new TiXmlElement( "name" );
        element11->SetAttribute("name","GongFong.rmvb");
        element1->LinkEndChild( element11 );//  element11 element1    (   )
 
        TiXmlElement * element2 = new TiXmlElement( "BT_ToDL" );
        element2->SetAttribute("num",10);//    
        doc.LinkEndChild(element2);
    //dump_to_stdout(&doc);
        doc.SaveFile( "1.xml" );
}
 
 
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;
                        default: printf( "%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);//            
    }
      
}
int main(int argc, char* argv[])
   {
 
        TiXmlDocument doc(argv[1]);
        bool loadOkay = doc.LoadFile();
        if (loadOkay)
        {
            pDoc = &doc;
                printf("/n%s:/n", argv[1]);
                //dump_to_stdout( &doc ); // defined later in the tutorial
                search2(&doc);                // TiXmlDocument         TiXmlNode  
        }
        else
        {
                printf("Failed to load file /"%s/"/n", argv[1]);
        }
  
     return 0;
   }
 
/*void dump_to_stdout1(const char* pFilename)
{
        TiXmlDocument doc(pFilename);
        bool loadOkay = doc.LoadFile();
        if (loadOkay)
        {
                printf("/n%s:/n", pFilename);
                dump_to_stdout( &doc ); // defined later in the tutorial
        }
        else
        {
                printf("Failed to load file /"%s/"/n", pFilename);
        }
int main(int argc, char* argv[])
{
        for (int i=1; i