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 )