Source code for src.xmlManager

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#  Copyright (C) 2010-2013  CEA/DEN
#
#  This library is free software; you can redistribute it and/or
#  modify it under the terms of the GNU Lesser General Public
#  License as published by the Free Software Foundation; either
#  version 2.1 of the License.
#
#  This library is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#  Lesser General Public License for more details.
#
#  You should have received a copy of the GNU Lesser General Public
#  License along with this library; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA

import os
try: # For python2
    import sys
    reload(sys)  
    sys.setdefaultencoding('utf8')
except:
    pass

import src
from . import ElementTree as etree

[docs]class XmlLogFile(object): '''Class to manage writing in salomeTools xml log file ''' def __init__(self, filePath, rootname, attrib = {}): '''Initialization :param filePath str: The path to the file where to write the log file :param rootname str: The name of the root node of the xml file :param attrib dict: the dictionary that contains the attributes and value of the root node ''' # Initialize the filePath and ensure that the directory # that contain the file exists (make it if necessary) self.logFile = filePath src.ensure_path_exists(os.path.dirname(filePath)) # Initialize the field that contain the xml in memory self.xmlroot = etree.Element(rootname, attrib = attrib)
[docs] def write_tree(self, stylesheet=None, file_path = None): '''Write the xml tree in the log file path. Add the stylesheet if asked. :param stylesheet str: The stylesheet to apply to the xml file ''' log_file_path = self.logFile if file_path: log_file_path = file_path try: f = open(log_file_path, 'w') f.write("<?xml version='1.0' encoding='utf-8'?>\n") if stylesheet: f.write("<?xml-stylesheet type='text/xsl' href='%s'?>\n" % stylesheet) f.write(etree.tostring(self.xmlroot, encoding='utf-8')) f.close() except IOError: pass
[docs] def add_simple_node(self, node_name, text=None, attrib={}): '''Add a node with some attibutes and text to the root node. :param node_name str: the name of the node to add :param text str: the text of the node :param attrib dict: the dictionary containing the attribute of the new node ''' n = etree.Element(node_name, attrib=attrib) n.text = text self.xmlroot.append(n) return n
[docs] def append_node_text(self, node_name, text): '''Append a new text to the node that has node_name as name :param node_name str: The name of the node on which append text :param text str: The text to append ''' # find the corresponding node for field in self.xmlroot: if field.tag == node_name: # append the text field.text += text
[docs] def append_node_attrib(self, node_name, attrib): '''Append a new attributes to the node that has node_name as name :param node_name str: The name of the node on which append text :param attrib dixt: The attrib to append ''' self.xmlroot.find(node_name).attrib.update(attrib)
[docs]class ReadXmlFile(object): '''Class to manage reading of an xml log file ''' def __init__(self, filePath): '''Initialization :param filePath str: The xml file to be read ''' self.filePath = filePath etree_inst = etree.parse(filePath) self.xmlroot = etree_inst.parse(filePath)
[docs] def getRootAttrib(self): '''Get the attibutes of the self.xmlroot :return: The attributes of the root node :rtype: dict ''' return self.xmlroot.attrib
[docs] def get_attrib(self, node_name): '''Get the attibutes of the node node_name in self.xmlroot :param node_name str: the name of the node :return: the attibutes of the node node_name in self.xmlroot :rtype: dict ''' attrib = self.xmlroot.find(node_name).attrib # To be python 3 compatible, convert bytes to str if there are any fixedAttrib = {} for k in attrib.keys(): if isinstance(k, bytes): key = k.decode() else: key = k if isinstance(attrib[k], bytes): value = attrib[k].decode() else: value = attrib[k] fixedAttrib[key] = value return fixedAttrib
[docs] def get_node_text(self, node): '''Get the text of the first node that has name that corresponds to the parameter node :param node str: the name of the node from which get the text :return: the text of the first node that has name that corresponds to the parameter node :rtype: str ''' return self.xmlroot.find(node).text
[docs]def add_simple_node(root_node, node_name, text=None, attrib={}): '''Add a node with some attibutes and text to the root node. :param root_node etree.Element: the Etree element where to add the new node :param node_name str: the name of the node to add :param text str: the text of the node :param attrib dict: the dictionary containing the attribute of the new node ''' n = etree.Element(node_name, attrib=attrib) n.text = text root_node.append(n) return n
[docs]def append_node_attrib(root_node, attrib): '''Append a new attributes to the node that has node_name as name :param root_node etree.Element: the Etree element where to append the new attibutes :param attrib dixt: The attrib to append ''' root_node.attrib.update(attrib)
[docs]def find_node_by_attrib(xmlroot, name_node, key, value): '''Find the nfirst ode from xmlroot that has name name_node and that has in its attributes {key : value}. Return the node :param xmlroot etree.Element: the Etree element where to search :param name_node str: the name of node to search :param key str: the key to search :param value str: the value to search :return: the found node :rtype: xmlroot etree.Element ''' l_nodes = xmlroot.findall(name_node) for node in l_nodes: if key not in node.attrib.keys(): continue if node.attrib[key] == value: return node return None
[docs]def write_report(filename, xmlroot, stylesheet): """Writes a report file from a XML tree. :param filename str: The path to the file to create :param xmlroot etree.Element: the Etree element to write to the file :param stylesheet str: The stylesheet to add to the begin of the file """ if not os.path.exists(os.path.dirname(filename)): os.makedirs(os.path.dirname(filename)) f = open(filename, "w") f.write("<?xml version='1.0' encoding='utf-8'?>\n") if len(stylesheet) > 0: f.write("<?xml-stylesheet type='text/xsl' href='%s'?>\n" % stylesheet) f.write(etree.tostring(xmlroot, encoding='utf-8')) f.close()