# a quick and dirty xml module for parsing and generating xml/html
#
# this is a very poor man's xml parser
# it uses the python syntax parser for parsing xml code
# and defines a tag class called T. xml code is first translated to
# valid python code and then evaluated. works also under jython.
#
# (c) f.jamitzky 2006
class T:
def __init__(self,name,args=[]):
arglist=name.split(" ")
self._name=arglist[0]
self._kw={}
self._args=args
if len(arglist)>1:
kw={}
for i in arglist[1:]:
key, val= i.split("=")
kw[key]=val
self._kw=kw
def __len__(self):
return len(self._args)
def __str__(self):
if self._args==[]:
if self._kw=={}:
txt="<"+self._name+"/>"
else:
txt="<"+self._name
for i in self._kw.keys():
txt+=" "+str(i)+"="+str(self._kw[i])+" "
txt=txt[:-1]+"/>"
else:
if self._kw=={}:
txt="<"+self._name+">"
else:
txt="<"+self._name
for i in self._kw.keys():
txt+=" "+str(i)+"="+str(self._kw[i])+" "
txt=txt[:-1]+">"
for arg in self._args:
txt+=str(arg)
txt+="</"+self._name+">"
return txt
def __repr__(self):
return str(self)
def __getitem__(self,key):
if type(key)==type(0):
return self._args[key]
elif type(key)==type(""):
return self._kw[key]
def __setitem__(self,key,value):
if type(key)==type(0):
if key<len(self._args):
self._args[key]=value
else:
self._args.insert(key,value)
else:
self._kw[key]=value
def keys(self):
return self._kw.keys()
def tags(self):
lst=[]
for i in range(len(self)):
try:
lst.append(self[i]._name)
except:
pass
return lst
def get_tag_by_name(self,strg):
lst=[]
for i in range(len(self)):
try:
if self[i]._name==strg:
lst.append(self[i])
except:
pass
if len(lst)==1:
return lst[0]
else:
return lst
def __getattr__(self,key):
try:
return self.get_tag_by_name(key)
except:
if self.__dict__.has_key(key):
return self.__dict__[key]
else:
raise AttributeError, "Name does not exist '%s.'" % (key)
def append(self,val):
self._args.append(val)
def xml2code(instr):
data=instr.replace("[","<lbracket/>").replace("]","<rbracket/>")
data=data.replace("\n","").replace('"',"'")
data=data.replace("?>","?/>").replace("-->","--/>")
data=data.replace("</","[]endtag[").replace("/>","[]mptytag[")
data=data.replace("<","[]starttag[").replace(">","[]closetag[")
data=data.split("[")
outstr=''
i=-1
lendata=len(data)
while i<lendata-1:
i+=1
x=data[i]
x=x.strip()
if len(x)==0:
continue
if x[0]=="]":
if x[1]=="s":
outstr+='T("'+data[i+1]+'",['
i=i+2
if data[i][0:2]=="]m":
outstr+=']),'
elif x[1]=="e":
outstr+=']),'
i=i+2
else:
outstr+='"'+x+'",'
outstr="T('root',["+outstr+"])"
outstr=outstr.replace(",)",")")
return outstr
def xml(strg):
return eval(xml2code(strg))[0]
print "parsing xml:"
data="""<a><a b='a'><b a='b'/></a><b>/a</b>b<a/><a/></a>"""
print "xml string:"
print data
tt=xml(data)
print "print:"
print tt
print "print tags:"
print tt.tags()
print "get tag 'a':"
print tt.a
print "generating html:"
html=xml("<html><head/><body/></html>")
html.body.append("Hello World from jython")
html.head['title']="Hello World"
print html
print ""