diff -r 000000000000 -r 044383f39525 imgtools/buildrom/tools/GenericParser.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imgtools/buildrom/tools/GenericParser.pm Tue Oct 27 16:36:35 2009 +0000 @@ -0,0 +1,194 @@ +# +# Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# Provides generic methods retrieving data from the XML file. +# Internally uses DOM API. Uses XML Checker to validate the XML. +# + +package genericparser; +require Exporter; +@ISA=qw(Exporter); + +@EXPORT=qw( + + getRootElement + getAttrValue + getElementValue + getSiblingElements + getNodeAttributes + getChildElements + getNodeFromTree + getElementsTagName + getElementName +); + +use strict; +use XML::DOM; +use XML::DOM::ValParser;#XML Validator + +my $validxml; # XML validation status +$XML::Checker::FAIL = \&failhandler; # User defined fail handler + +# User defined fail handler for the XML checker +sub failhandler +{ + my ($code, $msg, @context) = @_; + print "ERROR: $msg\n"; + $validxml = 0; +} + +#Returns the root element of the XML file +sub getRootElement() { + my ($xmlfile) = shift; + die "ERROR: XML File does not exists in the specified path $xmlfile\n" if (!-f $xmlfile); + my $DOMParser = new XML::DOM::Parser(); #DOM Parser + #Set the SGML_SEARCH_PATH to the path where the DTD files are found ($ENV{EPOCROOT}epoc32\\tools). + XML::Checker::Parser::set_sgml_search_path ("$ENV{EPOCROOT}epoc32/tools"); + my $xmlValidator = new XML::Checker::Parser();#Validates XML against Schema + $validxml = 1; + $xmlValidator->parsefile($xmlfile); + + if($validxml) + { + my $document = $DOMParser->parsefile($xmlfile);#Parse XML file + my $root = $document->getDocumentElement(); + return $root; + } + + return 0; +} + +#Returns the attribute value of the element +#Optional argument strictcaseflg does not convert the case of the attribute value +sub getAttrValue(){ + my ($elementname, $name, $strictcaseflg) = @_; + my $attrVal = $elementname->getAttribute($name) ; + if ($attrVal eq "") { + return undef; + } + if(!defined $strictcaseflg) { + return lc($attrVal); + } + else { + return $attrVal; + } +} + +#Returns the element value +#Optional argument strictcaseflg does not convert the case of the element value +sub getElementValue(){ + my ($elementname) = shift; + my ($strictcaseflg)=shift; + my $elementVal; + if( !$elementname->hasChildNodes() ) + { + return undef; + } + if ($elementname->getNodeType == XML::DOM::ELEMENT_NODE) { + $elementVal = $elementname->getFirstChild()->getData ; + } + + if(!defined $strictcaseflg) { + return lc($elementVal); + } + else { + return $elementVal; + } +} + +#Returns the sibling elements for the given node +sub getSiblingElements { + my $child = shift; + my @nodeList; + while($child) { + if($child->getNodeType eq XML::DOM::ELEMENT_NODE) { + @nodeList=(@nodeList,$child); + } + $child = $child->getNextSibling; + } + return @nodeList; +} + +#Returns the attribute list reference for the given node +sub getNodeAttributes() { + my $node = shift; + my $attlist; + if ($node->getNodeType() eq XML::DOM::ELEMENT_NODE) { + $attlist = $node->getAttributes; + } + return $attlist; +} + +#Returns the children for the given node element +sub getChildElements { + my $child = shift; + my @childList; + my @newChildList; + + @childList=$child->getChildNodes; + foreach my $node (@childList) { + if($node->getNodeType eq XML::DOM::ELEMENT_NODE) { + @newChildList=(@newChildList,$node); + } + } + return @newChildList; +} + +#Returns the list of nodes that matches the specified node tree +sub getNodeFromTree(){ + + my @resultNodes; + my ($element, @nodeNames) = @_; + my $nodeName; + my @children = $element->getChildNodes(); + + foreach my $child (@children) { + if ($child->getNodeType eq XML::DOM::ELEMENT_NODE) { + if (($child->getNodeName) eq $nodeNames[0]) { + if ($#nodeNames) { + $nodeName = shift @nodeNames;#Pop unmatched node + push @resultNodes,&getNodeFromTree($child, @nodeNames); + unshift @nodeNames, $nodeName;#Put back the nodes to proper level + } + else { + push @resultNodes,$child;#Push matched node to the destination + } + + } + + } + + } + + return @resultNodes; +} + +#Returns the list of elements whose node matches with the node name supplied +sub getElementsTagName{ + my ($node, $name) = @_; + if ($node->getNodeType eq XML::DOM::ELEMENT_NODE) { + my @taggedElements = $node->getElementsByTagName($name); + return @taggedElements; + } +} + +#Returns the element name for the given node +sub getElementName{ + my $node = shift; + if ($node->getNodeType eq XML::DOM::ELEMENT_NODE) { + return lc($node->getNodeName); + } +} + +1; \ No newline at end of file