our
$VERSION
=
'0.17'
;
sub
new {
my
(
$class
,
$entity
,
$value
,
$attrs
,
$parent
) =
@_
;
return
undef
unless
(
$entity
);
my
$node
=
undef
;
if
(
ref
(
$entity
) && UNIVERSAL::isa(
$entity
,
"XmlNodePtr"
)) {
$node
=
$entity
;
}
else
{
$node
= XML::TinyXML::XmlCreateNode(
$entity
,
$value
||
""
);
}
return
undef
unless
(
$node
);
if
(
ref
(
$parent
)) {
my
$pnode
=
undef
;
if
(UNIVERSAL::isa(
$parent
,
"XmlNodePtr"
)) {
$pnode
=
$parent
;
}
elsif
(UNIVERSAL::isa(
$parent
,
"XML::TinyXML::Node"
)) {
$pnode
=
$parent
->{_node};
}
if
(
$pnode
) {
XML::TinyXML::XmlAddChildNode(
$pnode
,
$node
);
}
}
my
$self
= {};
bless
(
$self
,
$class
);
$self
->{_node} =
$node
;
if
(
$attrs
&&
ref
(
$attrs
) eq
"HASH"
) {
$self
->addAttributes(
%$attrs
);
}
$self
;
}
sub
cleanAttributes {
my
(
$self
) =
@_
;
return
XML::TinyXML::XmlClearAttributes(
$self
->{_node});
}
sub
removeAttribute {
my
(
$self
,
$index
) =
@_
;
return
XML::TinyXML::XmlRemoveAttribute(
$self
->{_node},
$index
);
}
sub
loadHash {
my
(
$self
,
$hash
,
$childname
,
$reset
) =
@_
;
$self
->removeAllChildren
if
$reset
;
foreach
my
$k
(
keys
(
%$hash
)) {
my
$name
=
$childname
||
$k
;
if
(!
ref
(
$hash
->{
$k
}) ||
ref
(
$hash
->{
$k
}) eq
"SCALAR"
) {
$self
->addChildNode(XML::TinyXML::Node->new(
$name
,
$hash
->{
$k
}));
}
elsif
(
ref
(
$hash
->{
$k
}) eq
"HASH"
) {
my
$child
= XML::TinyXML::Node->new(
$name
);
$self
->addChildNode(
$child
);
$child
->loadHash(
$hash
->{
$k
});
}
elsif
(
ref
(
$hash
->{
$k
}) eq
"ARRAY"
) {
foreach
my
$entry
(@{
$hash
->{
$k
}}) {
$self
->loadHash({
__import__
=>
$entry
},
$name
);
}
}
}
}
sub
toHash {
my
(
$self
,
$parent
) =
@_
;
my
$hashref
= {};
foreach
my
$child
(
$self
->children) {
my
$key
=
$child
->name;
my
$value
=
$child
->value;
if
(
$child
->countChildren) {
$value
=
$child
->toHash(
$hashref
);
}
if
(
$hashref
->{
$key
}) {
if
(
ref
(
$hashref
->{
$key
}) eq
"ARRAY"
) {
push
(@{
$hashref
->{
$key
}},
$value
);
}
else
{
$hashref
->{
$key
} = [
$hashref
->{
$key
},
$value
];
}
}
else
{
$hashref
->{
$key
} =
$value
;
}
}
if
(
$parent
&&
$self
->value) {
if
(
$parent
->{
$self
->{name}}) {
if
(
ref
(
$parent
->{
$self
->name} eq
"ARRAY"
)) {
push
(@{
$parent
->{
$self
->name}},
$self
->value);
}
else
{
$parent
->{
$self
->name} = [
$parent
->{
$self
->name},
$self
->value ];
}
}
else
{
$parent
->{
$self
->name} =
$self
->value;
}
}
return
$hashref
;
}
sub
updateAttributes {
my
(
$self
,
%attrs
) =
@_
;
XML::TinyXML::XmlClearAttributes(
$self
->{_node});
$self
->addAttributes(
%attrs
);
}
sub
addAttributes {
my
(
$self
,
%attrs
) =
@_
;
foreach
my
$key
(
sort
keys
%attrs
) {
XML::TinyXML::XmlAddAttribute(
$self
->{_node},
$key
,
$attrs
{
$key
});
}
}
sub
name {
my
(
$self
,
$newname
) =
@_
;
$self
->{_node}->name(
$newname
)
if
(
$newname
);
return
$self
->{_node}->name;
}
sub
value {
my
(
$self
,
$newval
) =
@_
;
$self
->{_node}->value(
$newval
)
if
(
$newval
);
return
$self
->{_node}->value;
}
sub
path {
my
$self
=
shift
;
return
$self
->{_node}->path;
}
sub
getAttribute {
my
(
$self
,
$index
) =
@_
;
my
$attr
= XML::TinyXML::XmlGetAttribute(
$self
->{_node},
$index
);
return
XML::TinyXML::NodeAttribute->new(
$attr
)
if
(
$attr
);
}
sub
getAttributes {
my
(
$self
) =
shift
;
my
@res
;
for
(
my
$i
= 1;
$i
<= XML::TinyXML::XmlCountAttributes(
$self
->{_node});
$i
++) {
push
@res
, XML::TinyXML::NodeAttribute->new(XML::TinyXML::XmlGetAttribute(
$self
->{_node},
$i
));
}
return
wantarray
?
@res
:\
@res
;
}
sub
attributes {
my
(
$self
) =
shift
;
my
$res
= {};
for
(
my
$i
= 1;
$i
<= XML::TinyXML::XmlCountAttributes(
$self
->{_node});
$i
++) {
my
$attr
= XML::TinyXML::XmlGetAttribute(
$self
->{_node},
$i
);
$res
->{
$attr
->name} =
$attr
->value;
}
return
$res
;
}
sub
getChildNode {
my
(
$self
,
$index
) =
@_
;
return
XML::TinyXML::Node->new(XML::TinyXML::XmlGetChildNode(
$self
->{_node},
$index
));
}
sub
getChildNodeByName {
my
(
$self
,
$name
) =
@_
;
return
undef
unless
(
$name
);
return
XML::TinyXML::Node->new(XML::TinyXML::XmlGetChildNodeByName(
$self
->{_node},
$name
));
}
sub
getChildrenByName {
return
getChildNodeByName(
@_
);
}
sub
countChildren {
my
$self
=
shift
;
return
XML::TinyXML::XmlCountChildren(
$self
->{_node});
}
sub
children {
my
(
$self
) =
@_
;
my
@children
;
for
(
my
$i
= 1;
$i
<= XML::TinyXML::XmlCountChildren(
$self
->{_node});
$i
++) {
push
(
@children
, XML::TinyXML::Node->new(XML::TinyXML::XmlGetChildNode(
$self
->{_node},
$i
)));
}
return
wantarray
?
@children
:\
@children
;
}
sub
addChildNode {
my
(
$self
,
$child
) =
@_
;
return
undef
unless
(
$child
&& UNIVERSAL::isa(
$child
,
"XML::TinyXML::Node"
));
return
XML::TinyXML::XmlAddChildNode(
$self
->{_node},
$child
->{_node});
}
sub
removeChildNode {
my
(
$self
,
$index
) =
@_
;
XML::TinyXML::XmlRemoveChildNode(
$self
->{_node},
$index
);
}
sub
removeAllChildren {
my
(
$self
) =
@_
;
for
(
my
$i
= 1;
$i
<=
$self
->countChildren;
$i
++) {
XML::TinyXML::XmlRemoveChildNode(
$self
->{_node},
$i
);
}
}
sub
parent {
my
(
$self
) =
@_
;
return
XML::TinyXML::Node->new(
$self
->{_node}->parent);
}
sub
nextSibling {
my
(
$self
) =
@_
;
return
XML::TinyXML::Node->new(XML::TinyXML::XmlNextSibling(
$self
->{_node}));
}
sub
prevSibling {
my
(
$self
) =
@_
;
return
XML::TinyXML::Node->new(XML::TinyXML::XmlPrevSibling(
$self
->{_node}));
}
sub
type {
my
(
$self
) =
@_
;
my
$type
=
$self
->{_node}->type;
if
(
$type
== XML::TinyXML::XML_NODETYPE_SIMPLE()) {
$type
=
"NODE"
;
}
elsif
(
$type
== XML::TinyXML::XML_NODETYPE_COMMENT()) {
$type
=
"COMMENT"
;
}
elsif
(
$type
== XML::TinyXML::XML_NODETYPE_CDATA()) {
$type
=
"CDATA"
;
}
return
$type
;
}
1;