Changeset 5008


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

Progress on XML object model

Location:
anuga_core/source/anuga/utilities
Files:
3 edited

Legend:

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

    r4986 r5008  
    3737
    3838        # Generate a text file
    39         tmp_fd , tmp_name = mkstemp(suffix='.tmp',dir='.')
    40         fid = os.fdopen(tmp_fd,'w')
     39        tmp_fd , tmp_name = mkstemp(suffix='.tmp', dir='.')
     40        fid = os.fdopen(tmp_fd, 'w')
    4141        string = 'My temp file with textual content. AAAABBBBCCCC1234'
    4242        fid.write(string)
    43         fid.flush()
    4443        fid.close()
    4544
    4645        ref_crc = zlib.crc32(string)
    47 
    4846        checksum = compute_checksum(tmp_name)
    49 
    50 
    5147        assert checksum == ref_crc
    5248
     
    5652
    5753        # Binary file
    58         tmp_fd , tmp_name = mkstemp(suffix='.tmp',dir='.')
    59         fid = os.fdopen(tmp_fd,'w+b')
    60        
     54        tmp_fd , tmp_name = mkstemp(suffix='.tmp', dir='.')
     55        fid = os.fdopen(tmp_fd, 'w+b')
    6156
    6257        string = 'My temp file with binary content. AAAABBBBCCCC1234'
    6358        fid.write(string)
    64         fid.flush()
     59        fid.close()
    6560
    6661
     
    7065        assert checksum == ref_crc
    7166
    72         # Close and remove temporary file
    73         fid.close()
    7467        os.remove(tmp_name)       
    7568       
  • anuga_core/source/anuga/utilities/test_xml_tools.py

    r4976 r5008  
    44import unittest
    55from Numeric import zeros, array, allclose, Float
    6 from tempfile import NamedTemporaryFile
     6from tempfile import mkstemp, mktemp
     7
    78import os
    89
     
    1718        pass
    1819
    19     def notest_generate_xml(self):
     20    def test_generate_xml(self):
    2021        """Test that xml code is generated from XMLobject model
    2122        """
     
    4445        doc = XML_document(contents=X)
    4546
    46         print doc
     47        #print doc.pretty_print()       
     48        #print doc
     49        assert doc['all']['second element']['texts']['title 4'].elements == 'example text 4'
    4750
    48         print doc.pretty_print()
    4951       
    5052
    51     def notest_xml2object(self):
     53    def test_xml2object(self):
    5254        """Test that XML_document can be generated from file
    5355        """
    5456
    55         fid = NamedTemporaryFile(mode='w',
    56                                  suffix='.xml',
    57                                  dir='.')
    58 
     57        tmp_fd , tmp_name = mkstemp(suffix='.xml', dir='.')
     58        fid = os.fdopen(tmp_fd, 'w')
     59       
    5960        xml_string = """<?xml version="1.0" encoding="iso-8859-1"?>
    60 
    6161  <ga_license_file>
    6262    <metadata>
     
    7979      <IP_info>This is a test</IP_info>
    8080    </datafile>
    81 
    8281  </ga_license_file>
    8382""" %('1234')
    8483
    8584        fid.write(xml_string)
    86         fid.flush()
     85        fid.close()
    8786
    88         print fid.read()
     87        fid = open(tmp_name)
     88        reference = fid.read()
     89        reflines = reference.split('\n')
    8990       
    90         xml2object(fid, verbose=True)
     91        xmlobject = xml2object(fid, verbose=True)
     92
     93
     94        #print xmlobject.pretty_print()
     95       
     96        xmllines = str(xmlobject).split('\n')
     97
     98        #for line in reflines:
     99        #    print line
     100        #print   
     101        #for line in xmllines:
     102        #    print line           
     103
     104           
     105        assert len(reflines) == len(xmllines)
     106
     107        for i, refline in enumerate(reflines):
     108            msg = '%s != %s' %(refline.strip(), xmllines[i].strip())
     109            assert refline.strip() == xmllines[i].strip(), msg
     110
     111        # Check dictionary behaviour   
     112        for tag in xmlobject['ga_license_file'].keys():
     113            xmlobject['ga_license_file'][tag]
     114
     115        assert xmlobject['ga_license_file']['datafile']['accountable'].elements == 'Jane Sexton'
     116       
     117
     118        #print
     119        #print
     120        #print xmlobject['ga_license_file']['metadata']
     121        #print xmlobject['ga_license_file']['datafile']
     122        #print xmlobject['ga_license_file']['datafile']['accountable']       
     123
     124        #print xmlobject['ga_license_file'].keys()
     125
     126        #for tag in xmlobject['ga_license_file'].keys():
     127        #    print xmlobject['ga_license_file'][tag]
    91128               
    92129        # Clean up
    93 
    94130        fid.close()
    95131
  • 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.