AnyEvent-XMPP
view release on metacpan or search on metacpan
lib/AnyEvent/XMPP/Node.pm view on Meta::CPAN
=cut
sub add_text {
my ($self, $text) = @_;
push @{$self->[NODES]}, [NTEXT, $text];
}
=item B<text>
Returns the text for this node.
=cut
sub text {
join '', map $_->[1], grep { $_->[0] == NTEXT } @{$_[0]->[NODES] || []}
}
=item B<find_all (@path)>
This method does a recursive descent through the sub-nodes and
fetches all nodes that match the last element of C<@path>.
The elements of C<@path> consist of a array reference to an array with
two elements: the namespace key known by the C<$parser> and the tagname
we search for.
=cut
sub find_all {
my ($self, @path) = @_;
my $cur = shift @path;
my @ret;
for my $n ($self->nodes) {
if ($n->eq (@$cur)) {
if (@path) {
push @ret, $n->find_all (@path);
} else {
push @ret, $n;
}
}
}
@ret
}
=item B<write_on ($writer)>
This writes the current node out to the L<AnyEvent::XMPP::Writer> object in C<$writer>.
=cut
sub write_on {
my ($self, $w) = @_;
$w->raw ($self->as_string);
}
=item B<as_string ()>
This method returns the original character representation of this XML element
(and it's children nodes). Please note that the string is a unicode string,
meaning: to get octets use:
my $octets = encode ('UTF-8', $node->as_string);
Now you can roll stunts like this:
my $libxml = XML::LibXML->new;
my $doc = $libxml->parse_string (encode ('UTF-8', $node->as_string ()));
(You can use your favorite XML parser :)
=cut
sub as_string {
my ($self) = @_;
join '',
map { $_->[0] == NRAW ? $_->[1] : $_->[1]->as_string }
grep { $_->[0] != NTEXT }
@{$self->[NODES] || []};
}
=item B<append_raw ($string)>
This method is called by the parser to store original strings of this element.
=cut
sub append_raw {
my ($self, $str) = @_;
push @{$self->[NODES]}, [NRAW, $str];
}
=item B<to_sax_events ($handler)>
This method takes anything that can receive SAX events.
See also L<XML::GDOME::SAX::Builder> or L<XML::Handler::BuildDOM>
or L<XML::LibXML::SAX::Builder>.
With this you can convert this node to any DOM level 2 structure you want:
my $builder = XML::LibXML::SAX::Builder->new;
$node->to_sax_events ($builder);
my $dom = $builder->result;
print "Canonized: " . $dom->toStringC14N . "\n";
=cut
sub to_sax_events {
my ($self, $handler) = @_;
my $doc = { Parent => undef };
$handler->start_document ($doc);
$self->_to_sax_events ($handler);
$handler->end_document ($doc);
}
sub _to_sax_events {
my ($self, $handler) = @_;
$handler->start_element ({
NamespaceURI => $self->namespace,
Name => $self->name,
( run in 1.336 second using v1.01-cache-2.11-cpan-ceb78f64989 )