diff -r c7c26511138f -r 360bd6b35136 imgtools/buildrom/tools/GenericParser.pm --- a/imgtools/buildrom/tools/GenericParser.pm Wed Jun 16 16:51:40 2010 +0300 +++ b/imgtools/buildrom/tools/GenericParser.pm Wed Jun 23 16:56:47 2010 +0800 @@ -1,194 +1,196 @@ -# -# 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 +# +# 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 + +use romutl; + +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 (&get_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;