James.Q.L wrote:
>
> Thurn, Martin wrote:
> >
> >   I ran into similar problems for my module WWW::Search.
> >   No, out-of-the-box you can not re-use an HTML::TreeBuilder object to parse
> > a new file.  BUT you can use the following code as a "reset". I.e. call
> > parse, muck with the tree, do the following four lines, and call parse
> > again.  This does the same as new() but without changing the store_comments,
> > store_pis settings, etc:
> >
> >   $self->{'_head'} = $self->insert_element('head',1);
> >   $self->{'_pos'} = undef;  # pull it back up
> >   $self->{'_body'} = $self->insert_element('body',1);
> >   $self->{'_pos'} = undef;  # pull it back up again
>
> i will look into how that can be added to $tree later.
> but a reset method from HTML::TreeBuilder would be nice.

As per my previous post, I think $tree->eof or $tree->delete_content will
do the trick.

> >   The reason you can't re-use your HTML::Element is because it's a
> > reference, and when the tree gets deleted, your Element gets deleted right
> > along with it.
> >
> >  - - Martin Thurn
> >
>
> just found that $h->clone can get around this. too bad i can't do the same to a tree 
> before it
> parses the file.
>
> from HTML::Element,
>
> You are free to clone HTML::TreeBuilder trees, just as long as: 1) they're done 
> being parsed, or
> 2) you don't expect to resume parsing into the clone. (You can continue parsing into 
> the original;
> it is never affected.)
>
> just to make sure, (english isn't my first language) does it say that i can't clone 
> a tree if it
> doesn't parse something?

No. What this is saying is that you can't do:

  my $tree = new HTML::TreeBuilder;
  $tree->parse($string1);
  $tree->parse($string2);

  my $tree2 = $tree->clone;
  $tree2->parse($string3);

But, here, you could write

  $tree->parse($string4);

In other words, you can't carry on parsing HTML text into a cloned
tree, but the original tree is unaffected.

HTH,

Rob


Reply via email to