use strict; use XML::Rules; my $xml = <<'*END*'; <doc> <book> <name>Valka s mloky</name> <author>Karel Capek</author> <description>It's really <b>something</b> and I have to <u>underline it</u>.</description> </book> <book> <name>Predtucha</name> <author>Pujmanova</author> <description>It's really a <u>stupid</u> pointless book. Confront <link id="12345">this one</link>. And don't read this one please! </description> </book> </doc> *END* my $parser = new XML::Rules ( rules => [ _default => 'content', u => sub {my $str = $_[1]->{_content}; $str =~ tr/ /_/; return '_'.$str.'_'}, b => sub {my $str = $_[1]->{_content}; return '*'.$str.'*'}, link => sub { qq{<a href="http://www.books.com/find_book.pl?id=$_[1]->{id}">$_->{_content}</a>} }, book => sub { my $desc = $_[1]->{description}; $desc =~ s/\n/\n\t/g; print "Book: $_[1]->{name}\nAuthor: $_[1]->{author}\nDescription: $desc\n\n"; }, ], ); $parser->parsestring($xml);