Package pywbem :: Module tupletree
[frames] | no frames]

Source Code for Module pywbem.tupletree

  1  # 
  2  # (C) Copyright 2003,2004 Hewlett-Packard Development Company, L.P. 
  3  # 
  4  # This library is free software; you can redistribute it and/or 
  5  # modify it under the terms of the GNU Lesser General Public 
  6  # License as published by the Free Software Foundation; either 
  7  # version 2.1 of the License, or (at your option) any later version. 
  8  # 
  9  # This program is distributed in the hope that it will be useful, but 
 10  # WITHOUT ANY WARRANTY; without even the implied warranty of 
 11  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
 12  # Lesser General Public License for more details. 
 13  # 
 14  # You should have received a copy of the GNU Lesser General Public 
 15  # License along with this program; if not, write to the Free Software 
 16  # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
 17  # 
 18  # Author: Martin Pool <mbp@hp.com> 
 19  # 
 20   
 21  """ 
 22  tupletree - Convert XML DOM objects to and from tuple trees. 
 23   
 24  DOM is the standard in-memory representation of XML documents, but it 
 25  is very cumbersome for some types of processing where XML encodes 
 26  object structures rather than text documents.  Direct mapping to Python 
 27  classes may not be a good match either. 
 28   
 29  tupletrees may be created from an in-memory DOM using 
 30  dom_to_tupletree(), or from a string using xml_to_tupletree(). 
 31   
 32  Since the Python XML libraries deal mostly with Unicode strings they 
 33  are also returned here.  If plain Strings are passed in they will be 
 34  converted by xmldom. 
 35   
 36  Each node of the tuple tree is a Python 4-tuple, corresponding to an 
 37  XML Element (i.e. <tag>): 
 38   
 39    (NAME, ATTRS, CONTENTS, None) 
 40   
 41  The NAME is the name of the element. 
 42   
 43  The ATTRS are a name-value hash of element attributes. 
 44   
 45  The CONTENTS is a list of child elements. 
 46   
 47  The fourth element is reserved. 
 48  """ 
 49   
 50  from types import StringTypes 
 51  import xml.dom.minidom 
 52   
 53  __all__ = ['dom_to_tupletree', 'xml_to_tupletree'] 
 54   
55 -def dom_to_tupletree(node):
56 """Convert a DOM object to a pyRXP-style tuple tree. 57 58 Each element is a 4-tuple of (NAME, ATTRS, CONTENTS, None). 59 60 Very nice for processing complex nested trees. 61 """ 62 63 if node.nodeType == node.DOCUMENT_NODE: 64 # boring; pop down one level 65 return dom_to_tupletree(node.firstChild) 66 assert node.nodeType == node.ELEMENT_NODE 67 68 name = node.nodeName 69 attrs = {} 70 contents = [] 71 72 for child in node.childNodes: 73 if child.nodeType == child.ELEMENT_NODE: 74 contents.append(dom_to_tupletree(child)) 75 elif child.nodeType == child.TEXT_NODE: 76 assert isinstance(child.nodeValue, StringTypes), \ 77 "text node %s is not a string" % `child` 78 contents.append(child.nodeValue) 79 elif child.nodeType == child.CDATA_SECTION_NODE: 80 contents.append(child.nodeValue) 81 else: 82 raise RuntimeError("can't handle %s" % child) 83 84 for i in range(node.attributes.length): 85 attr_node = node.attributes.item(i) 86 attrs[attr_node.nodeName] = attr_node.nodeValue 87 88 # XXX: Cannot yet handle comments, cdata, processing instructions and 89 # other XML batshit. 90 91 # it's so easy in retrospect! 92 return (name, attrs, contents, None)
93 94
95 -def xml_to_tupletree(xml_string):
96 """Parse XML straight into tupletree.""" 97 dom_xml = xml.dom.minidom.parseString(xml_string) 98 return dom_to_tupletree(dom_xml)
99