XML-DOM-Lite
view release on metacpan or search on metacpan
lib/XML/DOM/Lite/Parser.pm view on Meta::CPAN
}
sub _handle_element_node {
my ($self, $elmnt) = @_;
if ($elmnt =~ /^<\/($EndTagCE)/o) {
$self->_handle_element_node_end($1);
}
elsif ($elmnt =~ /($ElemTagCE)>$/o) {
$self->_handle_element_node_start($1);
}
}
sub _handle_element_node_start {
my ($self, $elmnt) = @_;
# this node is a child of the last opened node (top of stack)
my $parent = $self->{stack}->[$#{$self->{stack}}];
my $node = $self->_mk_element_node($elmnt, $parent);
# last opened node to the top of the stack
push @{$self->{stack}}, $node;
# deal with XML style empty tags
if ($elmnt =~ /\/$/) {
$node = $self->_handle_element_node_end($elmnt);
}
if (defined $node->getAttribute('id')) {
$self->{document}->setElementById($node->getAttribute("id"), $node);
}
return $node;
}
sub _handle_element_node_end {
my ($self, $elmnt) = @_;
# node is now closed, pop it off the stack
pop @{$self->{stack}};
# parentNode is now at the top of the stack
return $self->{stack}->[$#{$self->{stack}}];
}
sub _mk_gen_node {
my ($self, $str, $parent, $type) = @_;
$parent = $self->{stack}->[$#{$self->{stack}}] unless $parent;
my $node = XML::DOM::Lite::Node->new({
nodeType => $type,
nodeValue => $str,
});
$parent->appendChild($node);
$node->ownerDocument($self->{document});
if ($type == DOCUMENT_TYPE_NODE) {
$node->{nodeName} = '#document-type';
} elsif ($type == PROCESSING_INSTRUCTION_NODE) {
$node->{nodeName} = '#processing-instruction';
} elsif ($type == TEXT_NODE) {
$node->{nodeName} = '#text';
} elsif ($type == CDATA_SECTION_NODE) {
$node->{nodeName} = '#cdata';
} elsif ($type == COMMENT_NODE) {
$node->{nodeName} = '#comment';
}
return $node;
}
sub _mk_text_node {
my ($self, $str, $parent) = @_;
$parent = $self->{stack}->[$#{$self->{stack}}] unless $parent;
my $node = XML::DOM::Lite::Node->new({
nodeName => '#text',
nodeType => TEXT_NODE,
nodeValue => $str,
});
$parent->appendChild($node);
$node->ownerDocument($self->{document});
return $node;
}
sub _mk_element_node {
my ($self, $elmnt, $parent) = @_;
my($tagName, $elmnt2) = split(/\s+/, $elmnt, 2);
$tagName =~ s/\/$//;
my $attrs = $self->_parse_attributes($elmnt2);
my $node = XML::DOM::Lite::Node->new({
nodeType => ELEMENT_NODE,
attributes => $attrs,
nodeName => $tagName,
tagName => $tagName,
});
$parent->appendChild($node);
$node->ownerDocument($self->{document});
return $node;
}
sub _parse_attributes {
my ($self, $elmnt) = @_;
my $attrs = XML::DOM::Lite::NodeList->new([ ]);
return $attrs unless $elmnt;
while ($elmnt =~ s/$ElemTagCE2//o) {
push @$attrs, XML::DOM::Lite::Node->new({
nodeType => ATTRIBUTE_NODE,
nodeName => $1,
nodeValue => defined($3) ? $3 : $4,
ownerDocument => $self->{document}
});
}
return $attrs;
}
1;
( run in 0.694 second using v1.01-cache-2.11-cpan-e1769b4cff6 )