您的位置:首页 > 其它

TinyXML中文指南四

2009-05-27 17:55 295 查看
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月做了更新
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: