package XML::LibXML::AttributeHash; use strict; use warnings; use Scalar::Util qw//; use Tie::Hash; our @ISA = qw/Tie::Hash/; use vars qw($VERSION); $VERSION = "2.0132"; # VERSION TEMPLATE: DO NOT CHANGE BEGIN { *__HAS_WEAKEN = defined(&Scalar::Util::weaken) ? sub () { 1 } : sub () { 0 }; }; sub element { return $_[0][0]; } sub from_clark { my ($self, $str) = @_; if ($str =~ m! \{ (.+) \} (.+) !x) { return ($1, $2); } return (undef, $str); } sub to_clark { my ($self, $ns, $local) = @_; defined $ns ? "{$ns}$local" : $local; } sub all_keys { my ($self, @keys) = @_; my $elem = $self->element; foreach my $attr (defined($elem) ? $elem->attributes : ()) { if (! $attr->isa('XML::LibXML::Namespace')) { push @keys, $self->to_clark($attr->namespaceURI, $attr->localname); } } return sort @keys; } sub TIEHASH { my ($class, $element, %args) = @_; my $self = bless [$element, undef, \%args], $class; if (__HAS_WEAKEN and $args{weaken}) { Scalar::Util::weaken( $self->[0] ); } return $self; } sub STORE { my ($self, $key, $value) = @_; my ($key_ns, $key_local) = $self->from_clark($key); if (defined $key_ns) { return $self->element->setAttributeNS($key_ns, "xxx:$key_local", "$value"); } else { return $self->element->setAttribute($key_local, "$value"); } } sub FETCH { my ($self, $key) = @_; my ($key_ns, $key_local) = $self->from_clark($key); if (defined $key_ns) { return $self->element->getAttributeNS($key_ns, "$key_local"); } else { return $self->element->getAttribute($key_local); } } sub EXISTS { my ($self, $key) = @_; my ($key_ns, $key_local) = $self->from_clark($key); if (defined $key_ns) { return $self->element->hasAttributeNS($key_ns, "$key_local"); } else { return $self->element->hasAttribute($key_local); } } sub DELETE { my ($self, $key) = @_; my ($key_ns, $key_local) = $self->from_clark($key); if (defined $key_ns) { return $self->element->removeAttributeNS($key_ns, "$key_local"); } else { return $self->element->removeAttribute($key_local); } } sub FIRSTKEY { my ($self) = @_; my @keys = $self->all_keys; $self->[1] = \@keys; if (wantarray) { return ($keys[0], $self->FETCH($keys[0])); } $keys[0]; } sub NEXTKEY { my ($self, $lastkey) = @_; my @keys = defined $self->[1] ? @{ $self->[1] } : $self->all_keys; my $found; foreach my $k (@keys) { if ($k gt $lastkey) { $found = $k and last; } } if (!defined $found) { $self->[1] = undef; return; } if (wantarray) { return ($found, $self->FETCH($found)); } return $found; } sub SCALAR { my ($self) = @_; return $self->element; } sub CLEAR { my ($self) = @_; foreach my $k ($self->all_keys) { $self->DELETE($k); } return $self; } __PACKAGE__ __END__ =head1 NAME XML::LibXML::AttributeHash - tie an XML::LibXML::Element to a hash to access its attributes =head1 SYNOPSIS tie my %hash, 'XML::LibXML::AttributeHash', $element; $hash{'href'} = 'http://example.com/'; print $element->getAttribute('href') . "\n"; =head1 DESCRIPTION This class allows an element's attributes to be accessed as if they were a plain old Perl hash. Attribute names become hash keys. Namespaced attributes are keyed using Clark notation. my $XLINK = 'http://www.w3.org/1999/xlink'; tie my %hash, 'XML::LibXML::AttributeHash', $element; $hash{"{$XLINK}href"} = 'http://localhost/'; print $element->getAttributeNS($XLINK, 'href') . "\n"; There is rarely any need to use XML::LibXML::AttributeHash directly. In general, it is possible to take advantage of XML::LibXML::Element's overloading. The example in the SYNOPSIS could have been written: $element->{'href'} = 'http://example.com/'; print $element->getAttribute('href') . "\n"; The tie interface allows the passing of additional arguments to XML::LibXML::AttributeHash: tie my %hash, 'XML::LibXML::AttributeHash', $element, %args; Currently only one argument is supported, the boolean "weaken" which (if true) indicates that the tied object's reference to the element should be a weak reference. This is used by XML::LibXML::Element's overloading. The "weaken" argument is ignored if you don't have a working Scalar::Util::weaken.
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
SAX | Folder | 0755 |
|
|
Attr.pod | File | 4.02 KB | 0644 |
|
AttributeHash.pm | File | 4.49 KB | 0644 |
|
Boolean.pm | File | 1.56 KB | 0644 |
|
CDATASection.pod | File | 1.28 KB | 0644 |
|
Comment.pod | File | 1.36 KB | 0644 |
|
Common.pm | File | 8.22 KB | 0644 |
|
Common.pod | File | 3.59 KB | 0644 |
|
DOM.pod | File | 6.23 KB | 0644 |
|
Devel.pm | File | 4.91 KB | 0644 |
|
Document.pod | File | 20.9 KB | 0644 |
|
DocumentFragment.pod | File | 819 B | 0644 |
|
Dtd.pod | File | 1.99 KB | 0644 |
|
Element.pod | File | 13.48 KB | 0644 |
|
ErrNo.pm | File | 27.83 KB | 0644 |
|
ErrNo.pod | File | 591 B | 0644 |
|
Error.pm | File | 8.47 KB | 0644 |
|
Error.pod | File | 5.97 KB | 0644 |
|
InputCallback.pod | File | 9.59 KB | 0644 |
|
Literal.pm | File | 2.04 KB | 0644 |
|
Namespace.pod | File | 3.28 KB | 0644 |
|
Node.pod | File | 25.38 KB | 0644 |
|
NodeList.pm | File | 7.31 KB | 0644 |
|
Number.pm | File | 1.87 KB | 0644 |
|
PI.pod | File | 2.22 KB | 0644 |
|
Parser.pod | File | 27.49 KB | 0644 |
|
Pattern.pod | File | 2.89 KB | 0644 |
|
Reader.pm | File | 5.75 KB | 0644 |
|
Reader.pod | File | 17.57 KB | 0644 |
|
RegExp.pod | File | 1.54 KB | 0644 |
|
RelaxNG.pod | File | 2.08 KB | 0644 |
|
SAX.pm | File | 2.96 KB | 0644 |
|
SAX.pod | File | 1.76 KB | 0644 |
|
Schema.pod | File | 1.96 KB | 0644 |
|
Text.pod | File | 5.47 KB | 0644 |
|
XPathContext.pm | File | 3.15 KB | 0644 |
|
XPathContext.pod | File | 11.49 KB | 0644 |
|
XPathExpression.pod | File | 1.64 KB | 0644 |
|