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 ) ; }