X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fmarcdump.c;h=cb72a8411491929a5ec2265b6a8b966f38542701;hb=e858b0c178feedf5ef60bf6e66956ef5c4fd0b83;hp=2dc36eff7a419601242453b2afce308bfaec345e;hpb=3eb8be5cd44ecdbd68ec3ca8a54ec86691ff9a4d;p=yaz-moved-to-github.git diff --git a/util/marcdump.c b/util/marcdump.c index 2dc36ef..cb72a84 100644 --- a/util/marcdump.c +++ b/util/marcdump.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-2007, Index Data ApS * See the file LICENSE for details. * - * $Id: marcdump.c,v 1.54 2007-12-17 20:59:32 adam Exp $ + * $Id: marcdump.c,v 1.55 2007-12-18 21:13:06 adam Exp $ */ #define _FILE_OFFSET_BITS 64 @@ -14,10 +14,20 @@ #if YAZ_HAVE_XML2 #include #include -#include #include #include +/* Libxml2 version < 2.6.15. xmlreader not reliable/present */ +#if LIBXML_VERSION < 20615 +#define USE_XMLREADER 0 +#else +#define USE_XMLREADER 1 +#endif + +#if USE_XMLREADER +#include +#endif + #endif #include @@ -93,32 +103,27 @@ static void marcdump_read_line(yaz_marc_t mt, const char *fname) fputs(wrbuf_cstr(wrbuf), stdout); wrbuf_destroy(wrbuf); } - { - WRBUF wrbuf = wrbuf_alloc(); - yaz_marc_write_trailer(mt, wrbuf); - fputs(wrbuf_cstr(wrbuf), stdout); - wrbuf_destroy(wrbuf); - } fclose(inf); } #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; - WRBUF wrbuf = wrbuf_alloc(); while ((ret = xmlTextReaderRead(reader)) == 1) { int type = xmlTextReaderNodeType(reader); if (type == XML_READER_TYPE_ELEMENT) { const char *name = (const char *) - xmlTextReaderConstName(reader); + xmlTextReaderLocalName(reader); if (!strcmp(name, "record")) { xmlNodePtr ptr = xmlTextReaderExpand(reader); @@ -136,11 +141,41 @@ static void marcdump_read_xml(yaz_marc_t mt, const char *fname) } } } - yaz_marc_write_trailer(mt, wrbuf); - fputs(wrbuf_cstr(wrbuf), stdout); - wrbuf_destroy(wrbuf); - 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")) + { + int r = yaz_marc_read_xml(mt, ptr); + if (r) + 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); } #endif