现在的位置: 首页 > 综合 > 正文

TinyXML中文指南四

2014年02月05日 ⁄ 综合 ⁄ 共 3357字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.