diff --git a/TestON/core/xmlparser.py b/TestON/core/xmlparser.py
index a41ed92..181f646 100644
--- a/TestON/core/xmlparser.py
+++ b/TestON/core/xmlparser.py
@@ -1,18 +1,18 @@
-#/usr/bin/env python
-'''
+# /usr/bin/env python
+"""
 Created on 07-Jan-2013
-Copyright 2013 Open Networking Foundation (ONF)
+Copyright 2013 Open Networking Foundation ( ONF )
 
 Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
 the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
 or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
 
-@author: Raghav Kashyap(raghavkashyap@paxterrasolutions.com)
+author:: Raghav Kashyap( raghavkashyap@paxterrasolutions.com )
 
     TestON is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 2 of the License, or
-    (at your option) any later version.
+    ( at your option ) any later version.
 
     TestON is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -23,50 +23,49 @@
     along with TestON.  If not, see <http://www.gnu.org/licenses/>.
 
 
-'''
-
+"""
 import xmldict
 import re
 
-class xmlparser :
 
-    def __init__(self) :
+class xmlparser:
+
+    def __init__( self ):
         self.default = ''
 
-    def parse(self,fileName) :
-        '''
+    def parse( self, fileName ):
+        """
          This will parse the params or topo or cfg file and return content in the file as Dictionary
-        '''
+        """
         self.fileName = fileName
-        matchFileName = re.match(r'(.*)\.(params|topo|cfg)', self.fileName, re.M | re.I)
+        matchFileName = re.match( r'(.*)\.(params|topo|cfg)', self.fileName, re.M | re.I )
         if matchFileName:
-            xml = open(fileName).read()
-            try :
-                parsedInfo = xmldict.xml_to_dict(xml)
+            xml = open( fileName ).read()
+            try:
+                parsedInfo = xmldict.xml_to_dict( xml )
                 return parsedInfo
-            except StandardError as e:
+            except Exception as e:
                 print "Error parsing file " + fileName + ": " + e.message
-        else :
+        else:
             print "File name is not correct"
 
-    def parseParams(self,paramsPath):
-        '''
+    def parseParams( self, paramsPath ):
+        """
          It will take the params file path and will return the params dictionary
-        '''
-        paramsPath = re.sub("\.","/",paramsPath)
-        paramsPath = re.sub("tests|examples","",paramsPath)
-        params = self.parse(main.tests_path+paramsPath+".params")
-        paramsAsString = str(params)
-        return eval(paramsAsString)
+        """
+        paramsPath = re.sub( "\.", "/", paramsPath )
+        paramsPath = re.sub( "tests|examples", "", paramsPath )
+        params = self.parse( main.tests_path + paramsPath + ".params" )
+        paramsAsString = str( params )
+        return eval( paramsAsString )
 
-    def parseTopology(self,topologyPath):
-        '''
+    def parseTopology( self, topologyPath ):
+        """
           It will take topology file path and will return topology dictionary
-        '''
-        topologyPath = re.sub("\.","/",topologyPath)
-        topologyPath = re.sub("tests|examples","",topologyPath)
-        #topology = self.parse(main.tests_path+"/"+topologyPath+".topo")
-        topology = self.parse(main.tests_path+topologyPath+".topo")
-        topoAsString = str(topology)
-        return eval(topoAsString)
-
+        """
+        topologyPath = re.sub( "\.", "/", topologyPath )
+        topologyPath = re.sub( "tests|examples", "", topologyPath )
+        # topology = self.parse( main.tests_path+"/"+topologyPath+".topo" )
+        topology = self.parse( main.tests_path + topologyPath + ".topo" )
+        topoAsString = str( topology )
+        return eval( topoAsString )
