2003-12-05 14:57:46 +00:00
/**
* section : xmlReader
* synopsis : Show how to extract subdocuments with xmlReader
* purpose : Demonstrate the use of xmlTextReaderPreservePattern ( )
* to parse an XML file with the xmlReader while collecting
* only some subparts of the document
* usage : reader3
2003-12-17 15:08:55 +00:00
* test : reader3 > reader3 . tmp ; diff reader3 . tmp reader3 . res ; rm reader3 . tmp
2003-12-05 14:57:46 +00:00
* author : Daniel Veillard
* copy : see Copyright for the status of this software .
*/
# include <stdio.h>
# include <libxml/xmlreader.h>
/**
* streamFile :
* @ filename : the file name to parse
*
* Parse and print information about an XML file .
*
* Returns the resulting doc with just the elements preserved .
*/
static xmlDocPtr
extractFile ( const char * filename , const xmlChar * pattern ) {
xmlDocPtr doc ;
xmlTextReaderPtr reader ;
int ret ;
/*
* build an xmlReader for that file
*/
reader = xmlReaderForFile ( filename , NULL , 0 ) ;
if ( reader ! = NULL ) {
/*
* add the pattern to preserve
*/
2003-12-05 16:10:21 +00:00
if ( xmlTextReaderPreservePattern ( reader , pattern , NULL ) < 0 ) {
2003-12-05 14:57:46 +00:00
fprintf ( stderr , " %s : failed add preserve pattern %s \n " ,
filename , ( const char * ) pattern ) ;
}
/*
* Parse and traverse the tree , collecting the nodes in the process
*/
ret = xmlTextReaderRead ( reader ) ;
while ( ret = = 1 ) {
ret = xmlTextReaderRead ( reader ) ;
}
if ( ret ! = 0 ) {
fprintf ( stderr , " %s : failed to parse \n " , filename ) ;
xmlFreeTextReader ( reader ) ;
return ( NULL ) ;
}
/*
* get the resulting nodes
*/
doc = xmlTextReaderCurrentDoc ( reader ) ;
/*
* Free up the reader
*/
xmlFreeTextReader ( reader ) ;
} else {
fprintf ( stderr , " Unable to open %s \n " , filename ) ;
return ( NULL ) ;
}
return ( doc ) ;
}
int main ( int argc , char * * argv ) {
const char * filename = " test3.xml " ;
const char * pattern = " preserved " ;
xmlDocPtr doc ;
if ( argc = = 3 ) {
filename = argv [ 1 ] ;
pattern = argv [ 2 ] ;
}
/*
* this initialize the library and check potential ABI mismatches
* between the version it was compiled for and the actual shared
* library used .
*/
LIBXML_TEST_VERSION
doc = extractFile ( filename , ( const xmlChar * ) pattern ) ;
if ( doc ! = NULL ) {
/*
* ouptut the result .
*/
xmlDocDump ( stdout , doc ) ;
/*
* don ' t forget to free up the doc
*/
xmlFreeDoc ( doc ) ;
}
/*
* Cleanup function for the XML library .
*/
xmlCleanupParser ( ) ;
2004-01-23 13:15:13 +00:00
/*
* this is to debug memory for regression tests
*/
xmlMemoryDump ( ) ;
2003-12-05 14:57:46 +00:00
return ( 0 ) ;
}