XML-DOM2
view release on metacpan or search on metacpan
lib/XML/DOM2/DOM/Element.pm view on Meta::CPAN
=cut
sub removeAttribute
{
my ($self, $name) = @_;
if($self->hasAttribute($name)) {
my $attribute = delete($self->{'attributes'}->{''}->{$name});
$attribute->delete;
}
}
=head2 $element->removeAttributeNS( $namespace, $name )
Remove a single attribute from this element.
=cut
sub removeAttributeNS
{
my ($self, $ns, $name) = @_;
if($self->hasAttributeNS($ns, $name)) {
my $attribute = delete($self->{'attributes'}->{$ns->ns_prefix}->{$name});
$attribute->delete;
}
}
=head2 $element->getAttributeNS( $namespace, $name )
Returns an attributes namespace in this element.
=cut
sub getAttributeNS
{
my ($self, $ns, $name) = @_;
if(not ref($ns)) {
confess "You must give ns methods the name space object, not just the URI or Prefix (skipped)";
}
my $prefix = $ns->ns_prefix;
$prefix = '' if not $prefix;
if($self->{'attributes'}->{$prefix}->{$name}) {
return $self->{'attributes'}->{$prefix}->{$name};
}
}
=head2 $element->setAttributeNS( $namespace, $name, $value )
Sets an attributes namespace in this element.
=cut
sub setAttributeNS
{
my ($self, $ns, $name, $value) = @_;
if(not ref($ns)) {
confess "You must give ns methods the name space object, not just the URI or Prefix (skipped)";
}
my $prefix = $ns->ns_prefix;
$self->{'attributes'}->{$prefix}->{$name} = $self->_get_attribute_object($name, $value, $ns);
if(not $self->{'attributes'}->{$prefix}->{$name}) {
warn "setAttributeNS was unable to set the attribute ";
}
}
=head2 $element->cdata( $text )
Rerieve and set this elements cdata (non tag cdata form)
=cut
sub cdata
{
my ($self, $text) = @_;
if($self->hasChildren()) {
$self->error(value => "Unable to get cdata for element with children, xml error!");
return;
}
if(defined($text)) {
if(ref($text) =~ /CDATA/) {
$self->{'cdata'} = $text;
} else {
$self->{'cdata'} = XML::DOM2::Element::CDATA->new($text, notag => 1);
}
}
return $self->{'cdata'};
}
=head2 $element->hasCDATA()
Return true if this element has cdata.
=cut
sub hasCDATA ($) {
my $self=shift;
return exists($self->{'cdata'});
}
=head2 $element->document()
Return this elements document, returns undef if no document available.
=cut
sub document
{
my ($self) = @_;
return $self->{'document'} if ref($self->{'document'});
if($self->getParent) {
return $self->getParent->document;
} else {
confess "Where you expecting an orphaned element ".$self->localName."\n";
return undef;
}
}
=head2 $element->insertBefore( $node, $childNode )
=head2 $element->insertChildBefore( $node, $childNode )
=head2 $element->insertNodeBefore( $node, $childNode )
=head2 $element->insertElementBefore( $node, $childNode )
Inserts a new element just before the referenced child.
=cut
sub insertBefore
{
my ($self, $newChild, $refChild) = @_;
return $self->appendElement($newChild) if not $refChild;
my $index = $self->findChildIndex($refChild);
return 0 if $index < 0; # NO_FOUND_ERR
return $self->insertAtIndex($newChild, $index);
}
*insertChildBefore=\&insertBefore;
*insertNodeBefore=\&insertBefore;
*insertElementBefore=\&insertBefore;
=head2 $element->insertAfter( $node, $childNode )
=head2 $element->insertChildAfter( $node, $childNode )
=head2 $element->insertElementAfter( $node, $childNode )
=head2 $element->insertNodeAfter( $node, $childNode )
Inserts a new child element just after the referenced child.
=cut
sub insertAfter
{
my ($self, $newChild, $refChild) = @_;
return $self->appendElement($newChild) if not $refChild;
my $index = $self->findChildIndex($refChild);
return 0 if $index < 0; # NO_FOUND_ERR
return $self->insertAtIndex($newChild, $index+1);
lib/XML/DOM2/DOM/Element.pm view on Meta::CPAN
# This index supports the getChildrenByName function
if($self->{'child'}->{$newChild->name}) {
push @{$self->{'child'}->{$newChild->name}}, $newChild;
} else {
$self->{'child'}->{$newChild->name} = [ $newChild ];
}
# Set in new parent
splice @{$self->{'children'}}, $index, 0, $newChild;
$newChild->setParent($self);
return 1;
}
=head2 $element->removeChildAtIndex( $index )
Removed the child at index and returns the now orphaned element.
=cut
sub removeChildAtIndex
{
my ($self, $index) = @_;
my $oldChild = splice @{$self->{'children'}}, $index, 1;
my $id = $oldChild->getElementId();
$self->document->removeId($id) if($id);
$self->document->removeElement($oldChild);
$oldChild->setParent(undef);
if(not $self->hasChildren) {
delete $self->{'childen'};
}
return $oldChild;
}
=head2 $element->createChildElement( $name, %options )
=head2 $element->createElement( $name, %options )
Not DOM2, creates a child element, appending to current element.
The advantage to using this method is the elements created
with $document->createElement create basic element objects or
base objects (those specified in the XML base class or it's kin)
Elements created with this could offer more complex objects back.
Example: an SVG Gradiant will have stop elements under it, creating
stop elements with $document->createElement will return an XML::DOM2::Element
create a stop element with $element->createChildElement and it will
return an SVG2::Element::Gradiant::Stop object (although both would
output the same xml) and it would also prevent you from creating invalid
child elements such as a group within a text element.
$element->createChildElement($name, %opts);
=cut
sub createChildElement
{
my ($self, $name, %opts) = @_;
my $element = $self->_element_handle($name, %opts, document => $self->document() );
if(ref($element) =~ /CDATA/) {
$self->cdata( $element );
} else {
$self->appendChild($element);
}
return $element;
}
*createElement=\&createChildElement;
=head1 AUTHOR
Martin Owens, doctormo@postmaster.co.uk
=head1 SEE ALSO
perl(1), L<XML::DOM2>, L<XML::DOM2::Element>
L<http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html> DOM at the W3C
=cut
return 1;
( run in 0.993 second using v1.01-cache-2.11-cpan-39bf76dae61 )