easy dom creation using LibXML?

Robin Berjon robin.berjon at expway.fr
Thu Jan 12 16:04:12 GMT 2006


On Jan 12, 2006, at 16:44, Richard Jolly wrote:
>   Wrap elements $tag as the successive ancestors of the element,  
> returns
> the
>   new element. $elt->wrap_in( 'td', 'tr', 'table') wraps the  
> element as
> a
>   single cell in a table for example.
>
> which may be going to far, but can be very nice when you find you need
> them.

I don't think it's going too far, it's clearly useful stuff and not  
terribly complicated (untested).

sub wrapIn {
   my $node = shift;
   my @parents = @_;

   my $dad = shift @parents;
   my ($ns, $ln) = ref $dad ? @$dad : (undef, $dad);
   my $elem = $node->ownerDocument->createElementNS($ns, $ln);
   $elem->appendChild($node);
   return $elem unless @parents;
   return wrapIn($elem, @parents);
}

This accepts both namespace and namespace-less modes:

   wrapIn($node, 'td', 'tr');
   wrapIn($node, [$xhtmlNS, 'td'], [$xhtmlNS, 'tr']);

It'll work identically on elements, text nodes, cdata sections,  
comments, PIs, and document fragments.

It would be easy to add an item to the array refs that would be a  
hash of attributes to add to that specific element upon creation. One  
could also make the $node argument optionally be an array ref so that  
several nodes could be wrapped at once.

-- 
Robin Berjon
    Senior Research Scientist
    Expway, http://expway.com/





More information about the london.pm mailing list