X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=util%2Fmarcdump.c;h=2dc36eff7a419601242453b2afce308bfaec345e;hb=3eb8be5cd44ecdbd68ec3ca8a54ec86691ff9a4d;hp=4a5ac25865946a974e341b7d80787d374e79f983;hpb=dc4414aeda179bc8ebe3fc46ac53e4a24d265d16;p=yaz-moved-to-github.git diff --git a/util/marcdump.c b/util/marcdump.c index 4a5ac25..2dc36ef 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.52 2007-04-17 20:26:18 adam Exp $ + * $Id: marcdump.c,v 1.54 2007-12-17 20:59:32 adam Exp $ */ #define _FILE_OFFSET_BITS 64 @@ -14,7 +14,7 @@ #if YAZ_HAVE_XML2 #include #include - +#include #include #include @@ -52,7 +52,7 @@ static void usage(const char *prog) { fprintf (stderr, "Usage: %s [-c cfile] [-f from] [-t to] " "[-i format] [-o format] " - "[-n] [-l pos=value] [-v] [-C chunk] [-s splitfname] file...\n", + "[-n] [-l pos=value] [-v] [-C chunk] [-s splitfname] [-p] file...\n", prog); } @@ -93,34 +93,54 @@ 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) { - xmlNodePtr ptr; - xmlDocPtr doc = xmlParseFile(fname); - if (!doc) - return; + xmlTextReaderPtr reader = xmlReaderForFile(fname, 0 /* encoding */, + 0 /* options */); - ptr = xmlDocGetRootElement(doc); - if (ptr) + if (reader) { - int r; + int ret; WRBUF wrbuf = wrbuf_alloc(); - r = yaz_marc_read_xml(mt, ptr); - if (r) - fprintf(stderr, "yaz_marc_read_xml failed\n"); - else + while ((ret = xmlTextReaderRead(reader)) == 1) { - yaz_marc_write_mode(mt, wrbuf); - - fputs(wrbuf_cstr(wrbuf), stdout); + int type = xmlTextReaderNodeType(reader); + if (type == XML_READER_TYPE_ELEMENT) + { + const char *name = (const char *) + xmlTextReaderConstName(reader); + if (!strcmp(name, "record")) + { + xmlNodePtr ptr = xmlTextReaderExpand(reader); + + 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); + } + } + } } + yaz_marc_write_trailer(mt, wrbuf); + fputs(wrbuf_cstr(wrbuf), stdout); wrbuf_destroy(wrbuf); + xmlFreeTextReader(reader); } - xmlFreeDoc(doc); } #endif @@ -152,6 +172,7 @@ static void dump(const char *fname, const char *from, const char *to, yaz_marc_iconv(mt, cd); } yaz_marc_xml(mt, output_format); + yaz_marc_enable_collection(mt); yaz_marc_write_using_libxml2(mt, write_using_libxml2); yaz_marc_debug(mt, verbose); @@ -307,6 +328,12 @@ static void dump(const char *fname, const char *from, const char *to, fprintf (cfile, "};\n"); fclose(inf); } + { + WRBUF wrbuf = wrbuf_alloc(); + yaz_marc_write_trailer(mt, wrbuf); + fputs(wrbuf_cstr(wrbuf), stdout); + wrbuf_destroy(wrbuf); + } if (cd) yaz_iconv_close(cd); yaz_marc_destroy(mt);