Many thanks to David, Bruce and Karl for suggestions - all were helpful!

David and Bruce both reminded me that scalar variables can be treated as
file handles:
    open(my $fh, "<", \$xml) or die "Couldn't open file handle: $!";
    my $batch = MARC::Batch->new( 'XML', $fh );

I had tried this without luck earlier.  David kindly sent a complete
example - which worked in isolation, but failed in the context of my
program with a frustrating "Couldn't open file handle: Invalid argument"
until I realized I'd forgotten the essential "use warnings"... which gave
me the frustrating but much more helpful:

"Strings with code points over 0xFF may not be mapped into in-memory file
handles"

A moment with Google found pages like this:
https://bugzilla.redhat.com/show_bug.cgi?id=1048324

which helped me realize that the XML I was retrieving from WorldCat really
was encoded as UTF-8, which I hadn't accounted for so far.

Wrapping my retrieved XML like so:
  utf8::encode($contents);

has resolved the problem, so far at least - have to test more with records
with diacritics to be sure.  But this helps me move forward.

Thanks again! --Andy

On Wed, Apr 18, 2018 at 4:25 PM, Andy Kohler <akohler...@gmail.com> wrote:

> Hi -
>
> I'm pulling records from the WorldCat Search API in MARCXML, and need to
> convert them to binary MARC for further evaluation, which I'll do via
> MARC::Record.
>
> Problem: Converting from MARCXML via MARC::File::XML seems to require
> reading the records from a file.  I've already got the XML stored in a
> variable, retrieved via LWP::Simple->get().
>
> Do I have to write the XML to a file, then read it in again to convert
> it?  Or am I just missing something obvious?
>
> I've tried things like:
> $xml = get($api_call); # also verified that $xml now contains MARCXML for
> 1 or more records
> my $batch =  MARC::File::XML->in($xml);
> while (my $record = $batch->next()) {
>   print $record;
> }
> but I get the error: Can't call method "next" on an undefined value
>
> Thanks --Andy
>
>

Reply via email to