新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> XML编辑器,XML解析器,XML开发环境
    [返回] 计算机科学论坛XML.ORG.CN讨论区 - XML技术『 XML工具及XML开发环境 』 → [原创]跪求:VC中tinyxml使用方法,哪位高手哥哥指教一下啊! 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 14053 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [原创]跪求:VC中tinyxml使用方法,哪位高手哥哥指教一下啊! 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     晴天 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:57
      门派:XML.ORG.CN
      注册:2006/4/26

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给晴天发送一个短消息 把晴天加入好友 查看晴天的个人资料 搜索晴天在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看晴天的博客楼主
    发贴心情 [原创]跪求:VC中tinyxml使用方法,哪位高手哥哥指教一下啊!

    跪求:VC中tinyxml使用方法,哪位高手哥哥指教一下啊!

       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/26 10:36:00
     
     zhu_ruixian 帅哥哟,离线,有人找我吗?射手座1983-12-2
      
      
      威望:2
      等级:大二期末(Java考了96分!)
      文章:406
      积分:3471
      门派:W3CHINA.ORG
      注册:2006/3/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zhu_ruixian发送一个短消息 把zhu_ruixian加入好友 查看zhu_ruixian的个人资料 搜索zhu_ruixian在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zhu_ruixian的博客2
    发贴心情 
    http://prdownloads.sourceforge.net/tinyxml/tinyxml_2_4_3.zip?download
    你下载的工程里面有一个,有个docs文档,你可以看一下,里面有类的结构和方法,挺详细的,不过是英文的。

    ----------------------------------------------
    为什么总是索取的人多,奉献的人少...

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/27 12:37:00
     
     zhu_ruixian 帅哥哟,离线,有人找我吗?射手座1983-12-2
      
      
      威望:2
      等级:大二期末(Java考了96分!)
      文章:406
      积分:3471
      门派:W3CHINA.ORG
      注册:2006/3/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zhu_ruixian发送一个短消息 把zhu_ruixian加入好友 查看zhu_ruixian的个人资料 搜索zhu_ruixian在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zhu_ruixian的博客3
    发贴心情 
    1.加载文件。
    TiXmlDocument doc( "demo.xml" );
    doc.LoadFile();
    2.
    void main(void)
    {
     TiXmlDocument doc("example1.xml");
     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);
     }
     return;
    }
    example1.xml 的内容如果是:
    <?xml version="1.0" ?>
    <Hello>World</Hello>
    输出为:
    DOCUMENT
    + DECLARATION
    + ELEMENT Hello
      + TEXT[World]
    3.建立文档的方法.
    void build( )
    {               TiXmlDocument doc;
     TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
     TiXmlElement * element = new TiXmlElement( "Hello" );
     TiXmlText * text = new TiXmlText( "World" );
     element->LinkEndChild( text );
     doc.LinkEndChild( decl );
     doc.LinkEndChild( element );
     doc.SaveFile( "example1.xml" );
    }
    4.设定节点属性。
    TiXmlElement  window = new TiXmlElement( "Demo" );  
    window->SetAttribute("name", "Circle");
    window->SetAttribute("x", 5);
    window->SetAttribute("y", 15);
    window->SetDoubleAttribute("radius", 3.14159);
    5.获取元素的所有属性,并打印出属性名称和值
    int printElement(TiXmlElement* pElement, unsigned int indent)
    {
     if ( !pElement ) return 0;

     TiXmlAttribute* pAttrib=pElement->FirstAttribute();
     int i=0;
     int ival;
     double dval;
     const char* pIndent=getIndent(indent);
     printf("\n");
     while (pAttrib)
     {
      printf( "%s%s: value=[%s]", pIndent, pAttrib->Name(), pAttrib->Value());

      if (pAttrib->QueryIntValue(&ival)==TIXML_SUCCESS)    printf( " int=%d", ival);
      if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval);
      printf( "\n" );
      i++;
      pAttrib=pAttrib->Next();
     }
     return i;
    }
    6.写入文件,其实上面已经用到了。
    doc.SaveFile( saveFilename );  
    7.建立一个其内容如下的文档:
    <?xml version="1.0" ?>
    <MyApp>
        <!-- Settings for MyApp -->
        <Messages>
            <Welcome>Welcome to MyApp</Welcome>
            <Farewell>Thank you for using MyApp</Farewell>
        </Messages>
        <Windows>
            <Window name="MainFrame" x="5" y="15" w="400" h="250" />
        </Windows>
        <Connection ip="192.168.0.1" timeout="123.456000" />
    </MyApp>

    void main( )  
    {  
     TiXmlDocument doc;  
     TiXmlElement* msg;
     TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );  //文档声明
     doc.LinkEndChild( decl );  

     TiXmlElement * root = new TiXmlElement( "MyApp" );  
     doc.LinkEndChild( root );  //根元素

     TiXmlComment * comment = new TiXmlComment();//xml注释
     comment->SetValue(" Settings for MyApp " );  
     root->LinkEndChild( comment );  //插入根元素之间
     TiXmlElement * msgs = new TiXmlElement( "Messages" );  
     root->LinkEndChild( msgs );  //定义元素Messages,插入到root

     msg = new TiXmlElement( "Welcome" );  //定义新元素,并插入到msgs
     msg->LinkEndChild( new TiXmlText( "Welcome to MyApp" ));  
     msgs->LinkEndChild( msg );  

     msg = new TiXmlElement( "Farewell" );  //定义新元素,并插入到msgs
     msg->LinkEndChild( new TiXmlText( "Thank you for using MyApp" ));  
     msgs->LinkEndChild( msg );  

     TiXmlElement * windows = new TiXmlElement( "Windows" );  
     root->LinkEndChild( windows );  //root中插入新元素windows

     TiXmlElement * window;
     window = new TiXmlElement( "Window" );  
     windows->LinkEndChild( window );  //定义新元素,并设定其属性。
     window->SetAttribute("name", "MainFrame");
     window->SetAttribute("x", 5);
     window->SetAttribute("y", 15);
     window->SetAttribute("w", 400);
     window->SetAttribute("h", 250);

     TiXmlElement * cxn = new TiXmlElement( "Connection" );  
     root->LinkEndChild( cxn );  
     cxn->SetAttribute("ip", "192.168.0.1");
     cxn->SetDoubleAttribute("timeout", 123.456); // floating point attrib
     
     dump_to_stdout( &doc );
     doc.SaveFile( "appsettings.xml" );  //保存文件
    }
    8.对象到XML的转换。
    ///class
    #include <string>
    #include <map>
    using namespace std;

    typedef std::map<std::string,std::string> MessageMap;

    // a basic window abstraction - demo purposes only
    class WindowSettings
    {
    public:
     int x,y,w,h;
     string name;

     WindowSettings()
      : x(0), y(0), w(100), h(100), name("Untitled")
     {
     }

     WindowSettings(int x, int y, int w, int h, const string& name)
     {
      this->x=x;
      this->y=y;
      this->w=w;
      this->h=h;
      this->name=name;
     }
    };

    class ConnectionSettings
    {
    public:
     string ip;
     double timeout;
    };

    class AppSettings
    {
    public:
     string m_name;
     MessageMap m_messages;
     list<WindowSettings> m_windows;
     ConnectionSettings m_connection;

     AppSettings() {}

     void save(const char* pFilename);
     void load(const char* pFilename);
     
     // just to show how to do it
     void setDemoValues()
     {
      m_name="MyApp";
      m_messages.clear();
      m_messages["Welcome"]="Welcome to "+m_name;
      m_messages["Farewell"]="Thank you for using "+m_name;
      m_windows.clear();
      m_windows.push_back(WindowSettings(15,15,400,250,"Main"));
      m_connection.ip="Unknown";
      m_connection.timeout=123.456;
     }
    };
    ///创建文件,并加载
    int main(void)
    {
     AppSettings settings;
     
     settings.save("appsettings2.xml");
     settings.load("appsettings2.xml");
     return 0;
    }
    ///创建,修改和保存
    int main(void)
    {
     // block: customise and save settings
     {
      AppSettings settings;
      settings.m_name="HitchHikerApp";
      settings.m_messages["Welcome"]="Don't Panic";
      settings.m_messages["Farewell"]="Thanks for all the fish";
      settings.m_windows.push_back(WindowSettings(15,25,300,250,"BookFrame"));
      settings.m_connection.ip="192.168.0.77";
      settings.m_connection.timeout=42.0;

      settings.save("appsettings2.xml");
     }
     
     // block: load settings
     {
      AppSettings settings;
      settings.load("appsettings2.xml");
      printf("%s: %s\n", settings.m_name.c_str(),
       settings.m_messages["Welcome"].c_str());
      WindowSettings & w=settings.m_windows.front();
      printf("%s: Show window '%s' at %d,%d (%d x %d)\n",
       settings.m_name.c_str(), w.name.c_str(), w.x, w.y, w.w, w.h);
      printf("%s: %s\n", settings.m_name.c_str(), settings.m_messages["Farewell"].c_str());
     }
     return 0;
    }
    输出:
    HitchHikerApp: Don't Panic
    HitchHikerApp: Show window 'BookFrame' at 15,25 (300 x 100)
    HitchHikerApp: Thanks for all the fish
    9.XML到对象的转换。
    void AppSettings::load(const char* pFilename)
    {
     TiXmlDocument doc(pFilename);
     if (!doc.LoadFile()) return;

     TiXmlHandle hDoc(&doc);
     TiXmlElement* pElem;
     TiXmlHandle hRoot(0);

     // block: name
     {
      pElem=hDoc.FirstChildElement().Element();
      // should always have a valid root but handle gracefully if it does
      if (!pElem) return;
      m_name=pElem->Value();

      // save this for later
      hRoot=TiXmlHandle(pElem);
     }

     // block: string table
     {
      m_messages.clear(); // trash existing table

      pElem=hRoot.FirstChild( "Messages" ).FirstChild().Element();
      for( pElem; pElem; pElem=pElem->NextSiblingElement())
      {
       const char *pKey=pElem->Value();
       const char *pText=pElem->GetText();
       if (pKey && pText)
       {
        m_messages[pKey]=pText;
       }
      }
     }

     // block: windows
     {
      m_windows.clear(); // trash existing list

      TiXmlElement* pWindowNode=hRoot.FirstChild( "Windows" ).FirstChild().Element();
      for( pWindowNode; pWindowNode; pWindowNode=pWindowNode->NextSiblingElement())
      {
       WindowSettings w;
       const char *pName=pWindowNode->Attribute("name");
       if (pName) w.name=pName;
       
       pWindowNode->QueryIntAttribute("x", &w.x); // If this fails, original value is left

    as-is
       pWindowNode->QueryIntAttribute("y", &w.y);
       pWindowNode->QueryIntAttribute("w", &w.w);
       pWindowNode->QueryIntAttribute("hh", &w.h);

       m_windows.push_back(w);
      }
     }

     // block: connection
     {
      pElem=hRoot.FirstChild("Connection").Element();
      if (pElem)
      {
       m_connection.ip=pElem->Attribute("ip");
       pElem->QueryDoubleAttribute("timeout",&m_connection.timeout);
      }
     }
    }

    10.一个比较完整的例子,加载任意的XML文档,并在控制台上输出。
    //
    #include "stdafx.h"
    #include "tinyxml.h"

    // ----------------------------------------------------------------------
    // STDOUT dump and indenting utility functions
    // ----------------------------------------------------------------------
    const unsigned int NUM_INDENTS_PER_SPACE=2;

    const char * getIndent( unsigned int numIndents )
    {
     static const char * pINDENT="                                      + ";
     static const unsigned int LENGTH=strlen( pINDENT );
     unsigned int n=numIndents*NUM_INDENTS_PER_SPACE;
     if ( n > LENGTH ) n = LENGTH;

     return &pINDENT[ LENGTH-n ];
    }

    // same as getIndent but no "+" at the end
    const char * getIndentAlt( unsigned int numIndents )
    {
     static const char * pINDENT="                                        ";
     static const unsigned int LENGTH=strlen( pINDENT );
     unsigned int n=numIndents*NUM_INDENTS_PER_SPACE;
     if ( n > LENGTH ) n = LENGTH;

     return &pINDENT[ LENGTH-n ];
    }

    int dump_attribs_to_stdout(TiXmlElement* pElement, unsigned int indent)
    {
     if ( !pElement ) return 0;

     TiXmlAttribute* pAttrib=pElement->FirstAttribute();
     int i=0;
     int ival;
     double dval;
     const char* pIndent=getIndent(indent);
     printf("\n");
     while (pAttrib)
     {
      printf( "%s%s: value=[%s]", pIndent, pAttrib->Name(), pAttrib->Value());

      if (pAttrib->QueryIntValue(&ival)==TIXML_SUCCESS)    printf( " int=%d", ival);
      if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval);
      printf( "\n" );
      i++;
      pAttrib=pAttrib->Next();
     }
     return i; 
    }

    void dump_to_stdout( TiXmlNode* pParent, unsigned int indent = 0 )
    {
     if ( !pParent ) return;

     TiXmlNode* pChild;
     TiXmlText* pText;
     int t = pParent->Type();
     printf( "%s", getIndent(indent));
     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, indent+1 );
     }
    }

    // load the named file and dump its structure to STDOUT
    void dump_to_stdout(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);
     }
    }

    // ----------------------------------------------------------------------
    // main() for printing files named on the command line
    // ----------------------------------------------------------------------
    int main(int argc, char* argv[])
    {
     for (int i=1; i<argc; i++)
     {
      dump_to_stdout(argv[i]);
     }
     return 0;
    }

    ----------------------------------------------
    为什么总是索取的人多,奉献的人少...

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/27 13:30:00
     
     晴天 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:57
      门派:XML.ORG.CN
      注册:2006/4/26

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给晴天发送一个短消息 把晴天加入好友 查看晴天的个人资料 搜索晴天在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看晴天的博客4
    发贴心情 
    谢谢强人!呵呵!
    还有没有在VC中调试,调用的l教程啊!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/4/27 14:47:00
     
     emmali808 美女呀,离线,快来找我吧!
      
      
      等级:大二(研究C++)
      文章:56
      积分:270
      门派:XML.ORG.CN
      注册:2008/3/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给emmali808发送一个短消息 把emmali808加入好友 查看emmali808的个人资料 搜索emmali808在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看emmali808的博客5
    发贴心情 
    高手!!!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/3/12 21:55:00
     
     emmali808 美女呀,离线,快来找我吧!
      
      
      等级:大二(研究C++)
      文章:56
      积分:270
      门派:XML.ORG.CN
      注册:2008/3/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给emmali808发送一个短消息 把emmali808加入好友 查看emmali808的个人资料 搜索emmali808在『 XML工具及XML开发环境 』的所有贴子 引用回复这个贴子 回复这个贴子 查看emmali808的博客6
    发贴心情 
    下不到楼上所说的那个doc,可以分享一下那个文档吗?我的email:xiaolistue@gmail.com
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/3/14 13:52:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML工具及XML开发环境 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/6/22 3:17:51

    本主题贴数6,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    100.586ms