reflist1.cpp
サンプルプログラム (第5回, 第6回)
reflist1.cpp
—
C++ source code,
3 kB (3584 bytes)
ファイルコンテンツ
// -*- C++ -*-
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include "tinyxml.h"
using std :: cout ;
using std :: cerr ;
using std :: endl ;
void
printUsage
( const char * argzero )
{
cerr << "Usage:" << endl << " " << argzero << endl
<< " No command line arguments allowed." << endl ;
}
// Copied from TinyXML tutorial ----
// Indents per space
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 ) ;
cout << endl ;
while ( pAttrib )
{
cout << pIndent << pAttrib -> Name () << ": value=["
<< pAttrib -> Value () << "]" ;
if ( pAttrib -> QueryIntValue ( & ival ) == TIXML_SUCCESS )
cout << " int=" << ival ;
if ( pAttrib -> QueryDoubleValue ( & dval ) == TIXML_SUCCESS )
cout << " d=" << std :: setprecision ( 1 ) << dval ;
cout << endl ;
++ 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 () ;
cout << getIndent ( indent ) ;
int num ;
switch ( t )
{
case TiXmlNode :: DOCUMENT :
cout << "Document" ;
break ;
case TiXmlNode :: ELEMENT :
cout << "Element [" << pParent -> Value () << "]" ;
num = dump_attribs_to_stdout ( pParent -> ToElement () , indent + 1 ) ;
switch ( num )
{
case 0 :
cout << " (No attributes)" ;
break ;
case 1 :
cout << getIndentAlt ( indent ) << "1 attribute" ;
break ;
default :
cout << getIndentAlt ( indent ) << num << " attributes" ;
break ;
}
break ;
case TiXmlNode :: COMMENT :
cout << "Comment: [" << pParent -> Value () << "]" ;
break ;
case TiXmlNode :: UNKNOWN :
cout << "Unknown" ;
break ;
case TiXmlNode :: TEXT :
pText = pParent -> ToText () ;
cout << "Text: [" << pText -> Value () << "]" ;
break ;
case TiXmlNode :: DECLARATION :
cout << "Declaration" ;
break ;
default :
break ;
}
cout << endl ;
for ( pChild = pParent -> FirstChild () ; pChild != 0 ;
pChild = pChild -> NextSibling () )
{
dump_to_stdout ( pChild, indent + 1 ) ;
}
}
int
main
( int argc ,
char * * argv )
{
if ( argc != 1 )
{
cerr << "Error: too many arguments." << endl ;
printUsage ( argv [ 0 ] ) ;
return 1 ;
}
TiXmlDocument doc ( "references-list.xml" ) ;
bool loadOkay = doc . LoadFile () ;
if ( ! loadOkay )
{
cerr << "Failed to load file \"references-list.xml\"" << endl ;
exit ( 1 ) ;
}
dump_to_stdout ( & doc ) ;
exit ( 0 ) ;
}
