底下用 lxml xPath 來 parser IPXACT file(.xml). 將來希望能透過 python template 的方式,把UVM寫成個 template file, 之後再用 code gen 的方式把 UVM 的 conf file 跟 register set, parameter set, interface set ...連接起來
from lxml import etree from StringIO import * import sys class Parser: _prefixmap = { 'spirit' : 'http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4', 'vendorExtensions' : '$UVM_REG_GEN/XMLSchema/SPIRIT', 'xsi' : 'http://www.w3.org/2001/XMLSchema-instance', } def __init__(self): self._tree = None def __del__(self): self._tree = None def open(self, ifile): """ open from IP-XACT file and build up etree by lxml """ try: self._ifile = StringIO(open(ifile, 'r').read()) self._tree = etree.parse(self._ifile) self._ifile.close() except IOError as e: print "%s not found or build up lxml etree fail" %(ifile) def close(self): """ close """ self._tree = None def findAll(self, stmt, dtype='text'): """ returnlist in ['text', 'tag', 'tail', attrib' ]dtype return list in [element ] """ found = filter(lambda i: i !=None, self._tree.xpath(stmt, namespaces=self._prefixmap)) if dtype == 'text': return map(lambda i: i.text, found) elif dtype == 'tag': return map(lambda i: i.tag, found) elif dtype == 'tail': return map(lambda i: i.tail, found) elif dtype == 'attrib': return map(lambda i: i.attrib, found) elif dtype == 'obj': return found else: raise valueError("dtype not support %s" %(dtype)) def main(): pp = Parser() pp.open('spi_rgm.spirit') print pp.findAll(stmt='/spirit:component/spirit:vendor', dtype='text') print pp.findAll(stmt='//spirit:vendor', dtype='text') print pp.findAll(stmt='//spirit:vendor', dtype='tag') print pp.findAll(stmt='//spirit:vendor', dtype='obj')[0].getparent().tag pp.close() del pp if __name__ == '__main__': main()
results
>>> ['spiritconsortium.org'] ['spiritconsortium.org'] ['{http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4}vendor'] {http://www.spiritconsortium.org/XMLSchema/SPIRIT/1.4}component
download
ref:
http://lxml.de/resolvers.html
沒有留言:
張貼留言