00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <libxml/xmlreader.h>
00038
00039 #include "xml_parser.h"
00040
00041 static xmlTextReaderPtr reader;
00042
00043 void openXMLDocument (const char * __filename)
00044 {
00045
00046 reader = xmlNewTextReaderFilename (__filename);
00047
00048 if (! reader)
00049 {
00050
00051 fprintf (stderr, "unable to open '%s'.\n", __filename);
00052 exit (1);
00053 }
00054 }
00055
00056 void closeXMLDocument ()
00057 {
00058
00059 xmlFreeTextReader (reader);
00060 }
00061
00062 std :: string getAttributeValue (const std :: string & __attr)
00063 {
00064
00065 xmlChar * value = xmlTextReaderGetAttribute (reader, (const xmlChar *) __attr.c_str ());
00066
00067 std :: string str ((const char *) value);
00068
00069 xmlFree (value);
00070
00071 return str;
00072 }
00073
00074 static bool isSep (const xmlChar * __text)
00075 {
00076
00077 for (unsigned i = 0; i < strlen ((char *) __text); i ++)
00078 if (__text [i] != ' ' && __text [i] != '\t' && __text [i] != '\n')
00079 return false;
00080 return true;
00081 }
00082
00083 std :: string getNextNode ()
00084 {
00085
00086 xmlChar * name, * value;
00087
00088 do
00089 {
00090 xmlTextReaderRead (reader);
00091 name = xmlTextReaderName (reader);
00092 value = xmlTextReaderValue (reader);
00093 }
00094 while (! strcmp ((char *) name, "#text") && isSep (value));
00095
00096 std :: string str;
00097
00098 if (strcmp ((char *) name, "#text"))
00099 str.assign ((char *) name);
00100 else
00101 str.assign ((char *) value);
00102
00103 if (name)
00104 xmlFree (name);
00105 if (value)
00106 xmlFree (value);
00107
00108 return str;
00109 }