use XML::Simple; use strict; my $config = XMLin('some.xhtml'); processhash($config,'$config'); sub processhash() { my ($href, $path, @junk) = @_; my %configr = %$href; foreach my $k (keys %configr) { print qq|$path :: $k = $configr{$k}\n|; if ($configr{$k} =~ m/HASH/i) //if it is another hash, iterate through that hash also { processhash($configr{$k},qq|$path -> {'$k'}|); } } } #### $config -> {'hx:scriptCollector'} -> {'f:loadBundle'} -> {'bundle_id'} :: basename = somebasename #### #### $config -> {'hx:scriptCollector'} -> {'h:form'} :: h:panelGrid = HASH(0x1e54150) #### $config -> {'hx:scriptCollector'} -> {'h:form'} -> {'h:panelGrid'} -> {'hruleDots1_panel_id'} :: width = 100% $config -> {'hx:scriptCollector'} -> {'h:form'} -> {'h:panelGrid'} -> {'hruleDots1_panel_id'} :: columnClasses = hruleDots $config -> {'hx:scriptCollector'} -> {'h:form'} -> {'h:panelGrid'} -> {'hruleDots1_panel_id'} :: cellspacing = 0 #### #### {'h:outputText'} :: AdjustCCDetails_ReasonCode_table_required_id = HASH(0x1e5400c) {'h:outputText'} -> {'AdjustCCDetails_ReasonCode_table_required_id'} :: value = * {'h:outputText'} -> {'AdjustCCDetails_ReasonCode_table_required_id'} :: styleClass = required #### #### {'h:panelGrid'} :: h:outputText = HASH(0x1e16050) {'h:panelGrid'} -> {'h:outputText'} :: value = #{somevalue} {'h:panelGrid'} -> {'h:outputText'} :: id = AdjustCCDetails_Comment_table_id {'h:panelGrid'} -> {'h:outputText'} :: styleClass = label