in reply to Re: XML::Parser - Usage of &
in thread XML::Parser - Usage of &

You are right, the parser is indeed treating the title as:

1. Company A 2. & 3. B Information

Therefore, does it mean that our code needs to have the ability to put all these three pieces together and save as one single title?

Many thanks for your help!

Replies are listed 'Best First'.
Re^3: XML::Parser - Usage of &
by tobyink (Canon) on Feb 20, 2013 at 12:35 UTC

    I'm guessing that right now the code (you haven't posted any, so the best I can do is guess!) in the Char handler is saving a reference to the last bit of character data, and then when the End handler sees the end of the Title element, it does something with that. Maybe something like this:

    use 5.010; use strict; use warnings; use XML::Parser; my ($got_title, $in_title); my $parser = XML::Parser->new( Handlers => { Start => sub { $in_title++ if $_[1] eq 'Title' }, End => sub { $in_title--, say "GOT TITLE: $got_title" if $_[ +1] eq 'Title' }, Char => sub { $got_title = $_[1] if $in_title }, }, ); $parser->parse(<<'XML'); <Document> <Title>Company A&amp;B Information</Title> <Abstract>Foo</Abstract> <Title>Company X&amp;Y Information</Title> <Abstract>Bar</Abstract> </Document> XML

    Instead you want the Char handler to accumulate the pieces of character data using either string appending, or pushing onto an array/arrayref, then use the Start and End handlers to signal when to start and end accumulating character data. For example:

    use 5.010; use strict; use warnings; use XML::Parser; my (@got_title, $in_title); my $parser = XML::Parser->new( Handlers => { Start => sub { $in_title++, @got_title = () if $_[1] eq 'Title +' }, End => sub { $in_title--, say "GOT TITLE: @got_title" if $_[ +1] eq 'Title'; }, Char => sub { push @got_title, $_[1] if $in_title }, }, ); $parser->parse(<<'XML'); <Document> <Title>Company A&amp;B Information</Title> <Abstract>Foo</Abstract> <Title>Company X&amp;Y Information</Title> <Abstract>Bar</Abstract> </Document> XML
    package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name

      Thank you! This is exactly the type of bug fix I will be implementing in my code. All makes sense now.

Re^3: XML::Parser - Usage of &amp;
by runrig (Abbot) on Feb 20, 2013 at 19:57 UTC