Why do you need to start with while (0); ?
#define end_element() \
while (0); \
do { \
if (xmlTextWriterEndElement (xo) == -1) { \
xml_error ("xmlTextWriterEndElement"); \
} \
} while (0)
Talking about the first while (0);