| 1 |
|
|---|
| 2 |
import xml.sax.handler; |
|---|
| 3 |
import logging; |
|---|
| 4 |
|
|---|
| 5 |
from ListStack import ListStack; |
|---|
| 6 |
from FieldContainer import FieldContainer; |
|---|
| 7 |
from Field import Field; |
|---|
| 8 |
|
|---|
| 9 |
class FCDContentHandler(xml.sax.handler.ContentHandler): |
|---|
| 10 |
"""A SAX-parser content handler class for .fcd files |
|---|
| 11 |
""" |
|---|
| 12 |
|
|---|
| 13 |
def __init__(self, reader): |
|---|
| 14 |
self.m_log = logging.getLogger("FCDContentHandler"); |
|---|
| 15 |
self.m_reader = reader; |
|---|
| 16 |
self.m_container = None; |
|---|
| 17 |
self.m_elemStack = ListStack(); |
|---|
| 18 |
|
|---|
| 19 |
def startDocument(self): |
|---|
| 20 |
self.m_log.debug("startDocument"); |
|---|
| 21 |
self.m_elemStack.clear(); |
|---|
| 22 |
|
|---|
| 23 |
def endDocument(self): |
|---|
| 24 |
self.m_log.debug("endDocument"); |
|---|
| 25 |
self.m_container.finalize(); |
|---|
| 26 |
self.m_reader.setFieldContainer(self.m_container); |
|---|
| 27 |
|
|---|
| 28 |
def startElement(self, name, attr): |
|---|
| 29 |
self.m_log.debug("startElement: %s", name); |
|---|
| 30 |
if name == "FieldContainer": |
|---|
| 31 |
container = FieldContainer(); |
|---|
| 32 |
self.m_container = container; |
|---|
| 33 |
self.m_elemStack.push(container); |
|---|
| 34 |
elif name == "Field": |
|---|
| 35 |
field = Field(); |
|---|
| 36 |
self.m_elemStack.top().addField(field); |
|---|
| 37 |
self.m_elemStack.push(field); |
|---|
| 38 |
else: |
|---|
| 39 |
self.m_log.error("startElement: unknown element: %s", name); |
|---|
| 40 |
return; |
|---|
| 41 |
|
|---|
| 42 |
for i, attrName in enumerate(attr.getNames()): |
|---|
| 43 |
self.m_log.debug("%s attr: %d - %s - %s", name, i, attrName, attr[attrName]); |
|---|
| 44 |
self.m_elemStack.top().setFCD(attrName, attr[attrName]); |
|---|
| 45 |
|
|---|
| 46 |
def endElement(self, name): |
|---|
| 47 |
self.m_log.debug("endElement: %s", name); |
|---|
| 48 |
|
|---|
| 49 |
self.m_elemStack.pop(); |
|---|
| 50 |
|
|---|
| 51 |
def characters(self, content): |
|---|
| 52 |
self.m_log.debug("characters: |%s|", content); |
|---|
| 53 |
|
|---|
| 54 |
currDesc = self.m_elemStack.top().getFCD("description"); |
|---|
| 55 |
if currDesc == None: |
|---|
| 56 |
self.m_elemStack.top().setFCD("description", content.lstrip(" \t")); |
|---|
| 57 |
else: |
|---|
| 58 |
currDesc += content.lstrip(" \t"); |
|---|
| 59 |
self.m_elemStack.top().setFCD("description", currDesc); |
|---|
| 60 |
|
|---|
| 61 |
|
|---|
| 62 |
class FCDReader: |
|---|
| 63 |
"""Reader for .fcd files - calls a SAX parser with the FCDContentHandler |
|---|
| 64 |
""" |
|---|
| 65 |
|
|---|
| 66 |
def read(self, fileName): |
|---|
| 67 |
|
|---|
| 68 |
self.m_container = None; |
|---|
| 69 |
|
|---|
| 70 |
self.m_fcdCH = FCDContentHandler(self); |
|---|
| 71 |
self.m_parser = xml.sax.make_parser(); |
|---|
| 72 |
self.m_parser.setContentHandler(self.m_fcdCH); |
|---|
| 73 |
|
|---|
| 74 |
self.m_parser.parse(fileName); |
|---|
| 75 |
|
|---|
| 76 |
fcdFile = open(fileName, "r"); |
|---|
| 77 |
fcdContents = fcdFile.readlines(); |
|---|
| 78 |
fcdFile.close(); |
|---|
| 79 |
|
|---|
| 80 |
self.m_container.setFCDContents(fcdContents); |
|---|
| 81 |
|
|---|
| 82 |
def setFieldContainer(self, fc): |
|---|
| 83 |
self.m_container = fc; |
|---|
| 84 |
|
|---|
| 85 |
def getFieldContainer(self): |
|---|
| 86 |
return self.m_container; |
|---|
| 87 |
|
|---|