Ignore:
Timestamp:
Feb 7, 2008, 6:28:04 PM (17 years ago)
Author:
ole
Message:

Progress on XML object model

File:
1 edited

Legend:

Unmodified
Added
Removed
  • anuga_core/source/anuga/utilities/xml_tools.py

    r4976 r5008  
    7070#----------------------------
    7171
    72 class XML_element:
     72class XML_element(dict):
    7373    def __init__(self, tag=None, contents=None):
    7474        """
     
    8484           
    8585        self.elements = contents
    86 
    8786        self.tag = tag
     87        # FIXME: It might be better to represent these objects
     88        # in a proper dictionary format with
     89        # {tag: elements, ...}
     90       
    8891
    8992    def __add__(self, other):
     
    9598    def __repr__(self):
    9699        return str(self)
    97 
    98     def __str__(self):
    99         pass
    100100
    101101    def __str__(self, indent=0):
     
    114114        s += '</%s>\n' %self.tag
    115115        return s
     116
     117
     118    def __getitem__(self, key):
     119        """Return sub-tree starting at element with tag equal to specified key
     120        """
     121
     122        #if isinstance(self, XML_element):
     123        for node in self.elements:
     124            if node.tag == key:
     125                return node
     126
     127    def keys(self):
     128        return [str(node.tag) for node in self.elements]
    116129
    117130   
     
    138151
    139152    def __init__(self, contents=None, version='1.0', encoding='iso-8859-1'):
    140         tag = '?xml version="%s" encoding="%s"' %(version, encoding)
     153        tag = '?xml version="%s" encoding="%s"?' %(version, encoding)
    141154
    142155        XML_element.__init__(self,
     
    151164        for e in self.elements:
    152165            s += str(e)
     166
    153167        return s
    154168
     
    180194    dom = parse(xml)
    181195
    182     print 'Res',    dom2object(dom)
     196    return dom2object(dom)
    183197
    184198
    185199
    186200def dom2object(node):
    187 
    188     if node.nodeType == 3 and len(node.nodeValue.strip()) == 0:
    189         return None
    190        
    191     print 'Node name: "%s",' %node.nodeName,\
    192           'Node type: "%s",' %node.nodeType,\
    193           'Node value: "%s",' %str(node.nodeValue).strip(),\
    194           'Node children: %d' %len(node.childNodes)
    195 
    196    
    197 
    198     if node.nodeType == 3:
    199         contents = node.nodeValue.strip()
    200     else:   
    201         contents = []
    202         for n in node.childNodes:
    203             x = dom2object(n)
    204             if x is not None:
    205                 contents.append(x)
     201    """Convert DOM representation to XML_object hierarchy.
     202    """
     203
     204    contents = []
     205    for n in node.childNodes:
     206
     207        #print 'Node name: "%s",' %n.nodeName,\
     208        #      'Node type: "%s",' %n.nodeType,\
     209        #      'Node value: "%s",' %str(n.nodeValue).strip(),\
     210        #      'Node children: %d' %len(n.childNodes)       
     211
     212        if n.nodeType == 3:
     213            # Child is a text element - omit the dom tag #text and
     214            # go straight to the text value.
     215
     216            msg = 'Text element has child nodes - this shouldn\'t happen'
     217            assert len(n.childNodes) == 0, msg
     218
     219           
     220            x = n.nodeValue.strip()
     221            if len(x) == 0:
     222                # Skip empty text children
     223                continue
     224           
     225            contents = x
     226        else:
     227            contents.append(dom2object(n))
     228
     229
    206230
    207231
    208232    if node.nodeType == 9:
    209         # Document
    210         X = XML_document()
    211        
    212     X = XML_element(tag=node.nodeName,
    213                     contents=contents)
     233        # Document root
     234        X = XML_document(contents=contents)
     235    else:
     236        # Node
     237        X = XML_element(tag=node.nodeName,
     238                        contents=contents)
     239       
    214240    return X
Note: See TracChangeset for help on using the changeset viewer.