- Timestamp:
- Apr 3, 2014 5:22:58 AM (11 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- caf273b
- Parents:
- 307fa4f
- Location:
- src/sans/dataloader/readers
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sans/dataloader/readers/cansas_reader.py
rb65ae90 rea67541 28 28 29 29 _ZERO = 1e-16 30 PREPROCESS = "xmlpreprocess" 30 31 HAS_CONVERTER = True 31 32 try: … … 212 213 data1d.filename = name 213 214 data1d.meta_data["loader"] = "CanSAS 1D" 215 216 # Get all preprocessing events 217 self.reader.setProcessingInstructions() 218 data1d.meta_data[PREPROCESS] = \ 219 self.reader.processingInstructions 220 221 # Parse the XML file 214 222 return_value, extras = \ 215 223 self._parse_entry(entry, ns, data1d) … … 247 255 return None 248 256 249 def _create_unique_key(self, dictionary, name, i ):257 def _create_unique_key(self, dictionary, name, i = 0): 250 258 """ 251 259 Create a unique key value for any dictionary to prevent overwriting 252 260 Recurses until a unique key value is found. 253 261 254 262 :param dictionary: A dictionary with any number of entries 255 263 :param name: The index of the item to be added to dictionary 256 :param i: The number to be appended to the name 264 :param i: The number to be appended to the name, starts at 0 257 265 """ 258 266 if dictionary.get(name) is not None: … … 291 299 if HAS_CONVERTER == True: 292 300 try: 293 ## Check local units - bad units shouldraise KeyError301 ## Check local units - bad units raise KeyError 294 302 Converter(local_unit) 295 303 data_conv_q = Converter(attr['unit']) … … 347 355 CANSAS_NS.get(self.cansas_version).get("ns"), "}") 348 356 unit = '' 357 tagname = '' 358 tagname_original = '' 349 359 350 360 # Go through each child in the parent element … … 440 450 exec item 441 451 # Don't bother saving empty information unless it is a float 442 if cs_values.ns_variable is not None and node_value is not None and \ 452 if cs_values.ns_variable is not None and \ 453 node_value is not None and \ 443 454 node_value.isspace() == False: 444 455 # Format a string and then execute it. 445 store_me = cs_values.ns_variable.format("data1d", node_value, tagname) 456 store_me = cs_values.ns_variable.format("data1d", \ 457 node_value, tagname) 446 458 exec store_me 447 459 # Get attributes and process them … … 503 515 504 516 main_node = doc.createElement("SASroot") 505 if self.cansas_version == "1.1": 506 pi = doc.createProcessingInstruction('xml-stylesheet', \ 507 'type="text/xsl" href="cansasxml-html.xsl"') 508 root = doc.firstChild 509 doc.insertBefore(pi, root) 517 518 doc = self.setProcessingInstructions(doc, datainfo.meta_data[PREPROCESS]) 510 519 main_node.setAttribute("version", self.cansas_version) 511 520 main_node.setAttribute("xmlns", ns) … … 789 798 fd.write(doc.toprettyxml()) 790 799 fd.close() 800 801 ## Once I convert the writer to lxml from minidom 802 ## This can be moved into xml_reader 803 def setProcessingInstructions(self, minidomObject, dic): 804 xmlroot = minidomObject.firstChild 805 for item in dic: 806 pi = minidomObject.createProcessingInstruction(item, dic[item]) 807 minidomObject.insertBefore(pi, xmlroot) 808 return minidomObject 809 810 -
src/sans/dataloader/readers/xml_reader.py
r76cd1ae rea67541 14 14 15 15 from lxml import etree 16 parser = etree.ETCompatXMLParser( )16 parser = etree.ETCompatXMLParser(remove_comments=True, remove_pis=False) 17 17 18 18 class XMLreader(): … … 23 23 schema = None 24 24 schemadoc = None 25 processingInstructions = None 25 26 26 27 def __init__(self, xml = None, schema = None, root = None): 27 28 self.xml = xml 28 29 self.schema = schema 30 self.processingInstructions = {} 29 31 if xml is not None: 30 32 self.setXMLFile(xml, root) … … 48 50 49 51 def setXMLFile(self, xml, root = None): 52 """ 53 Set the XML file and parse 54 """ 50 55 try: 51 56 self.xml = xml … … 58 63 59 64 def setSchema(self, schema): 65 """ 66 Set the schema file and parse 67 """ 60 68 try: 61 69 self.schema = schema … … 78 86 def findInvalidXML(self): 79 87 """ 80 Finds the first offending element that should not be present in anXML file88 Finds the first offending element that should not be present in XML file 81 89 """ 82 90 firstError = "" … … 96 104 self.setSchema(self.schema) 97 105 106 def toString(self, etreeElement): 107 """ 108 Converts and etree element into a string 109 """ 110 return etree.tostring(etreeElement) 111 112 def setProcessingInstructions(self): 113 """ 114 Take out all processing instructions and create a dictionary from them 115 """ 116 dic = {} 117 pi = self.xmlroot.getprevious() 118 while pi is not None: 119 attr = {} 120 pi_name = "" 121 pi_string = self.toString(pi) 122 if isinstance(pi_string, str): 123 pi_string = pi_string.replace("<?", "").replace("?>", "") 124 split = pi_string.split(" ", 1) 125 pi_name = split[0] 126 attr = split[1] 127 new_pi_name = self._create_unique_key(dic, pi_name) 128 dic[new_pi_name] = attr 129 pi = pi.getprevious() 130 self.processingInstructions = dic 131 132 def _create_unique_key(self, dictionary, name, i = 0): 133 """ 134 Create a unique key value for any dictionary to prevent overwriting 135 Recurses until a unique key value is found. 136 137 :param dictionary: A dictionary with any number of entries 138 :param name: The index of the item to be added to dictionary 139 :param i: The number to be appended to the name, starts at 0 140 """ 141 if dictionary.get(name) is not None: 142 i += 1 143 name = name.split("_")[0] 144 name += "_{0}".format(i) 145 name = self._create_unique_key(dictionary, name, i) 146 return name 147 148
Note: See TracChangeset
for help on using the changeset viewer.