TinyXML中文指南四

dump_to_stdout的完整列表

下面是一个可直接运行的示例程序,使用上面提到过的递归遍历方式,可用来加载任意的XML文件并把结构输出到STDOUT上。

// 指南示例程序
#include "stdafx.h"
#include "tinyxml.h"

// ———————————————————————-
// STDOUT输出和缩进实用函数
// ———————————————————————-
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 ];
}

// 与getIndent相同,但最后没有“+”
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 );
     }
}

// 加载指定的文件并把它的结构输出到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 );
     }
    else
     {
         printf("Failed to load file /" %s/”/n", pFilename);
     }
}

// ———————————————————————-
// main(),打印出从命令行指定的文件
// ———————————————————————-
int main(int argc, char * argv[])
{
    for (int i=1; i<argc; i++)
     {
         dump_to_stdout(argv[i]);
     }
    return 0;
}

从命令行或者DOS窗口运行它,例如:

C:/dev/tinyxml> Debug/tinyxml_1.exe example1.xml
example1.xml:
Document
+ Declaration
+ Element [Hello]
   (No attributes)
   + Text: [World]

作者与修改

  • Ellers写于2005年4,5,6月
  • Lee Thomason于2005年9月略加编辑后集成到文档系统中
  • Ellers于2005年10月做了更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值