You're not a long way away from what you need to do. twig_roots supplies a reference to a sub to handle matching elements. Consider:
use warnings;
use strict;
use XML::Twig;
my $xmlStr = <<XML;
<config>
<one id="msn" type="shopping">
<traffic>
<daily value="on" />
<weekly value="off" />
<monthly value="off" />
</traffic>
</one>
<one id="movies" type="entertainment">
<traffic>
<daily value="on" />
<weekly value="off" />
<monthly value="on" />
</traffic>
</one>
<one id="espn" type="sports">
<traffic>
<daily value="on" />
<weekly value="on" />
<monthly value="on" />
<hyper value="true" />
</traffic>
</one>
</config>
XML
my $result = '';
my $twig = XML::Twig->new (twig_roots => {one => sub {oneHandler (\$re
+sult, @_);}});
$twig->parse ($xmlStr);
print $result;
sub oneHandler {
my ($resRef, $twig, $elt) = @_;
$$resRef = join ' ', $$resRef, $elt->att ('id');
return;
}
Prints:
msn movies espn
Note that there were a few missing close " in your sample XML that I've fixed.
Also notice that I created an anonymous sub so I could pass extra parameters into the handler thus avoiding the need for global variables.
Perl reduces RSI - it saves typing
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|