package hiXMLDOMParser;
our @ISA = qw( hiXMLParser );
require Exporter;
require hiXMLParser;
use Data::Dumper;
use hiErrCode;
use XML::DOM;
use XML::DOM::NamedNodeMap;
use vars qw( $parser, $doc );
#constructor
sub new
{
my $self = {};
bless $self, "hiXMLDOMParser";
$self->init();
return $self;
}
# init routines
sub init
{
$parser = new XML::DOM::Parser;
}
##################################################
# Parser XML File
#
# Parameters : XML File name to parse
# Returns : Object to the parsed XML file
##################################################
sub parse_file
{
my ($this, $file_name_wpath) = @_;
if (!$parser->isa("XML::DOM::Parser"))
{
$this->set_hi_errno(HI_XML_PARSE_ERROR);
return;
}
if (!$file_name_wpath)
{
#print "XML Parser : Invalid file name '$file_name_wpath'\n";
$this->set_hi_errno(HI_FAILURE);
return;
}
if (!(-r $file_name_wpath))
{
#print "XML Parser : File '$file_name_wpath' not found.\n";
$this->set_hi_errno(HI_FAILURE);
return;
}
$doc = $parser->parsefile($file_name_wpath);
$this->set_hi_errno(HI_SUCCESS);
return;
}
##################################################
# set xml parser ref.
# Parameters : hiXMLParser object reference
# Returns : None
##################################################
sub set_xml_parser_objref
{
my ($this, $xml_objref) = @_;
$parser = $xml_objref;
}
#sub get_sibling_element_cnts
#{
# $sibling_elem_vals{$elem} = $elem_val;
#}
#####################################################################
# get the sibling elements
#
# Parameters : Parent element name
# Returns : Array of parent sibling elements
# On SUCCESS - Array of children
# On FAILURE - sets hi_errno to appropriate error code
#####################################################################
sub get_sibling_elements
{
my($this, $parent_elem) = @_;
my @sibling_elems = ();
my @sibling_elems_ref =
$this->get_sibling_elements_objref($parent_elem);
if ($this->get_hi_errno() != HI_SUCCESS)
{
return;
}
foreach my $node (@sibling_elems_ref)
{
push(@sibling_elems, $node->getTagName());
}
$this->set_hi_errno(HI_SUCCESS);
return(@sibling_elems);
}
#####################################################################
# get the sibling elements by reference
#
# Parameters : Parent element name
# Returns : Array of parent sibling elements object reference
# On SUCCESS - Array of children ref
# On FAILURE - sets hi_errno to appropriate error code
#####################################################################
sub get_sibling_elements_objref
{
my($this, $parent_elem) = @_;
my @sibling_elems_ref = ();
# find the given parent element
if ($this->is_debug_set)
{
print __FILE__, ":", "Parent <$parent_elem>\n";
}
my $parent_nodes = $doc->getElementsByTagName($parent_elem);
if ($parent_nodes->getLength < 1)
{
$this->set_hi_errno(HI_XML_ELEMENT_NOT_FOUND);
return;
}
my $parent_node = $parent_nodes->item(0);
my $child_nodes = $parent_node->getChildNodes();
my $child_len = $child_nodes->getLength();
if ($child_len < 1)
{
$this->set_hi_errno(HI_XML_NO_CHILDREN);
return;
}
for (my $cnt=0; $cnt<$child_len; $cnt++)
{
my $node = $child_nodes->item($cnt);
my $node_type = $node->getNodeType();
if ($node_type == ELEMENT_NODE)
{
push(@sibling_elems_ref, $node);
}
}
$this->set_hi_errno(HI_SUCCESS);
return(@sibling_elems_ref);
}
###################################################
# get the sibling values
#
# Parameters : parent element name
# Returns : hash of sibling element/value
####################################################
sub get_sibling_values
{
my($this, $parent_elem) = @_;
my %sibling_elem_vals = ();
my $elem, $elem_val;
#print "<font color=blue>Parent Element '$parent_elem' </font>\n";
# find the given parent element
my $parent_nodes = $doc->getElementsByTagName($parent_elem);
if ($parent_nodes == undef)
{
$this->set_hi_errno(HI_XML_NO_CHILDREN);
return;
}
my $parent_len = $parent_nodes->getLength();
#print "<font color=red>Parent Element len '$parent_len' </font>\n
+";
my $parent_node = $parent_nodes->item(0);
my $child_nodes = $parent_node->getChildNodes();
my $child_len = $child_nodes->getLength();
if ($child_len < 1)
{
$this->set_hi_errno(HI_XML_NO_CHILDREN);
return;
}
for (my $cnt=0; $cnt<$child_len; $cnt++)
{
my $node = $child_nodes->item($cnt);
if ($node->getNodeType == ELEMENT_NODE)
{
my $elem = $node->getTagName();
# get the element value
my $elem_val = $this->get_element_value($node);
if ($sibling_elem_vals{$elem})
{
my $tmp_val = $sibling_elem_vals{$elem};
my $new_tmp_val = $tmp_val . ",". $elem_val;
$sibling_elem_vals{$elem} = $new_tmp_val;
} else {
$sibling_elem_vals{$elem} = $elem_val;
}
if ($this->is_debug_set)
{
print __FILE__, ":", "Get Value Key <$elem> ",
"Value <$elem_val>\n";
}
}
}
$this->set_hi_errno(HI_SUCCESS);
return(%sibling_elem_vals);
}
sub get_value_by_elem_name
{
my($this, $elem_name) = @_;
# find the given parent element
my $elem_nodes = $doc->getElementsByTagName($elem_name);
if ($elem_nodes == undef)
{
$this->set_hi_errno(HI_XML_NO_CHILDREN);
return;
}
my $elem_len = $elem_nodes->getLength();
my $elem_node = $elem_nodes->item(0);
my $elem_val = $this->get_element_value($node);
return($elem_val);
}
##################################################
# get the element value
#
# Parameters : element node
# Returns :
# On SUCCESS - Value of the given element
# the array will contain only one value.
# On FAILURE - HI_XML_ELEMENT_NOT_FOUND
##################################################
sub get_element_value
{
my($this, $elem_node) = @_;
if (!$elem_node->isa("XML::DOM::Element"))
{
$this->set_hi_errno(HI_XML_NOT_AN_ELEMENT);
return;
}
my $elem_name = $elem_node->getTagName();
if ($this->is_debug_set)
{
print __FILE__, ":", "get_element_value : <$elem_name>\n";
}
# get the text nodes
my @child_nodes = $elem_node->getChildNodes();
my $elem_val;
#foreach $child_node (@child_nodes)
#{
my $child_node = $elem_node->getFirstChild();
if ($child_node == undef)
{
$this->set_hi_errno(HI_XML_NO_CHILDREN);
return;
}
if ($child_node->getNodeType() != TEXT_NODE)
{
$this->set_hi_errno(HI_XML_CHILD_NOT_A_TEXT);
return;
}
# get the value of the element
if ($elem_val)
{
$elem_val = $elem_val . "," . $child_node->getData();
} else {
$elem_val = $child_node->getData();
}
#}
$this->set_hi_errno(HI_SUCCESS);
return($elem_val);
}
######################################################################
# get the element attributes
#
# Parameters : Element name
# Returns : Hash of attribute key/value pair
######################################################################
sub get_element_attribs
{
my($this, $elem_name) = @_;
my %elem_attribs= ();
# Get the child nodes
my $elem_nodes = $doc->getElementsByTagName($elem_name);
if ($elem_nodes == undef)
{
$this->set_hi_errno(HI_XML_ELEMENT_NOT_FOUND);
return;
}
# Get the first matching element
my $elem_node = $elem_nodes->item(0);
if ($elem_node->getNodeType == ELEMENT_NODE)
{
# get the element name
my $parsed_elem_name = $elem_node->getTagName();
if ($this->is_debug_set)
{
print __FILE__, ":", "Get Elem Attrib - ",
"Element Name '$parsed_elem_name'\n";
}
# get the element attributes
my $elem_attr_map = $elem_node->getAttributes();
my @elem_attrs = $elem_attr_map->getValues();
if ($this->is_debug_set)
{
print "_"x25, "\n";
}
foreach my $attr (@elem_attrs)
{
my $attr_name = $attr->getNodeName();
my $attr_value = $attr->getNodeValue();
if ($this->is_debug_set)
{
print "Attrname '$attr_name' AttrValue '$attr_value'\n
+";
}
$elem_attribs{$attr_name} = $attr_value;
}
if ($this->is_debug_set)
{
print "_"x25, "\n";
}
}
$this->set_hi_errno(HI_SUCCESS);
return(%elem_attribs);
}
##################################################
# get the XML parser version
#
# Parameters : None
# Returns : The XML Parser version used
##################################################
sub get_version
{
return($XML::DOM::VERSION);
}
|