+}
+
+
+#if YAZ_HAVE_XML2
+static void marcdump_read_xml(yaz_marc_t mt, const char *fname)
+{
+ WRBUF wrbuf = wrbuf_alloc();
+#if USE_XMLREADER
+ xmlTextReaderPtr reader = xmlReaderForFile(fname, 0 /* encoding */,
+ 0 /* options */);
+
+ if (reader)
+ {
+ int ret;
+ while ((ret = xmlTextReaderRead(reader)) == 1)
+ {
+ int type = xmlTextReaderNodeType(reader);
+ if (type == XML_READER_TYPE_ELEMENT)
+ {
+ char *name = (char *) xmlTextReaderLocalName(reader);
+ if (!strcmp(name, "record") || !strcmp(name, "r"))
+ {
+ xmlNodePtr ptr = xmlTextReaderExpand(reader);
+
+ int r = yaz_marc_read_xml(mt, ptr);
+ if (r)
+ {
+ no_errors++;
+ fprintf(stderr, "yaz_marc_read_xml failed\n");
+ }
+ else
+ {
+ int write_rc = yaz_marc_write_mode(mt, wrbuf);
+ if (write_rc)
+ {
+ yaz_log(YLOG_WARN, "yaz_marc_write_mode: "
+ "write error: %d", write_rc);
+ no_errors++;
+ }
+ fputs(wrbuf_cstr(wrbuf), stdout);
+ wrbuf_rewind(wrbuf);
+ }
+ }
+ xmlFree(name);
+ }
+ }
+ xmlFreeTextReader(reader);
+ }
+#else
+ xmlDocPtr doc = xmlParseFile(fname);
+ if (doc)
+ {
+ xmlNodePtr ptr = xmlDocGetRootElement(doc);
+ for (; ptr; ptr = ptr->next)
+ {
+ if (ptr->type == XML_ELEMENT_NODE)
+ {
+ if (!strcmp((const char *) ptr->name, "collection"))
+ {
+ ptr = ptr->children;
+ continue;
+ }
+ if (!strcmp((const char *) ptr->name, "record") ||
+ !strcmp((const char *) ptr->name, "r"))
+ {
+ int r = yaz_marc_read_xml(mt, ptr);
+ if (r)
+ {
+ no_errors++;
+ fprintf(stderr, "yaz_marc_read_xml failed\n");
+ }
+ else
+ {
+ yaz_marc_write_mode(mt, wrbuf);
+
+ fputs(wrbuf_cstr(wrbuf), stdout);
+ wrbuf_rewind(wrbuf);
+ }
+ }
+ }
+ }
+ xmlFreeDoc(doc);
+ }
+#endif
+ fputs(wrbuf_cstr(wrbuf), stdout);
+ wrbuf_destroy(wrbuf);