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月做了更新