It will be something like that. For the moment, I'm just implemented the basics of presentation mathml. I will add features as I need them.
After running it, sympify should be called. What do you think about it? def parseMML(mmlinput): from lxml import etree from StringIO import * from lxml import objectify mmlinput= mmlinput.replace(' xmlns="', ' xmlnamespace="') parser = etree.XMLParser(ns_clean=True,remove_pis=True,remove_comments=True) tree = etree.parse(StringIO(mmlinput), parser) objectify.deannotate(tree,cleanup_namespaces=True,xsi=True,xsi_nil=True) mmlinput=etree.tostring(tree.getroot()) exppy="" #this is the python expression symvars=[] #these are symbolic variables which can eventually take part in the expression events = ("start", "end") level = 0 context = etree.iterparse(StringIO(mmlinput),events=events) for action, elem in context: if (action=='start') and (elem.tag=='mfrac'): level += 1 mmlaux=etree.tostring(elem[0]) (a,b)=parseMML(mmlaux) symvars.append(b) exppy+=a exppy+='/' mmlaux=etree.tostring(elem[1]) (a,b)=parseMML(mmlaux) symvars.append(b) exppy+=a if (action=='end') and (elem.tag=='mfrac'): level -= 1 if level: continue if (action=='start') and (elem.tag=='mrow'): exppy+='(' if (action=='end') and (elem.tag=='mrow'): exppy+=')' if action=='start' and elem.tag=='mn': #this is a number exppy+=elem.text if action=='start' and elem.tag=='mi': #this is a variable exppy+=elem.text symvars.append(elem.text) #we'll return the variable, so sympy can sympify it afterwards if action=='start' and elem.tag=='mo': #this is a operation exppy+=elem.text return (exppy, symvars) With the example: mmlinput='''<?xml version="1.0"?> <math xmlns="http://www.w3.org/1998/Math/MathML" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/1998/Math/MathML http://www.w3.org/Math/XMLSchema/mathml2/mathml2.xsd"> <mrow> <mfrac> <mrow> <mn>3</mn> </mrow> <mrow> <mn>57</mn> </mrow> </mfrac> </mrow> </math>''' We get: exppy='((3)/(57))' El martes, 2 de julio de 2013 21:32:22 UTC+2, peibol escribió: > > Thanks, I'll try to make my function the more generic I can. > > > El martes, 2 de julio de 2013 21:01:00 UTC+2, Ondřej Čertík escribió: >> >> On Tue, Jul 2, 2013 at 12:32 PM, peibol <pab...@gmail.com> wrote: >> > I think xml2dict cannot accomplish it, since I get the same key for >> multiple >> > values... >> > >> > For example: mathml_prueba='''<mrow> <mfrac> <mrow> <mn>3</mn> </mrow> >> > <mrow> <mn>5</mn> </mrow> </mfrac> </mrow> ''' >> > >> > I get the following dict: >> > {'mrow': {'mfrac': {'mrow': [{'mn': '3'}, {'mn': '5'}]}}} >> > Notice the merged 'mrow' key... >> > >> > Any suggestion for a xml lib to parse the expression? >> >> lxml seems to be able to parse the expression: >> >> http://nbviewer.ipython.org/5912034 >> >> Ondrej >> >> > >> > >> > El martes, 2 de julio de 2013 19:53:28 UTC+2, peibol escribió: >> >> >> >> The mathdox box produces Presentation Mathml. >> >> >> >> Sympy produces Content Mathml in the printing module, but there is the >> c2p >> >> function in utils module that converts Content Mathml into >> Presentation >> >> Mathml. >> >> >> >> So I'm trying the xml2dict parsing with presentation mathml... I think >> >> that once I have the dict, at least for easy expressions like >> fractions, >> >> with addings, algebraic... it's nothing more than a -sophisticated- >> >> replacement with some parenthesis abuse. >> >> >> >> El martes, 2 de julio de 2013 19:38:08 UTC+2, Aaron Meurer escribió: >> >>> >> >>> Just to be clear, is this presentation mathml or content mathml? I >> >>> believe the latter would be much easier to parse. >> >>> >> >>> Aaron Meurer >> >>> >> >>> On Tue, Jul 2, 2013 at 12:03 PM, Ondřej Čertík <ondrej...@gmail.com> >> >>> wrote: >> >>> > On Tue, Jul 2, 2013 at 10:35 AM, Stefan Krastanov >> >>> > <krastano...@gmail.com> wrote: >> >>> >> I am sorry, I do not think there is an out-of-the-box way to do >> this >> >>> >> currently. >> >>> >> >> >>> >> What I can suggest is to use the xml2dict python library to parse >> the >> >>> >> openmath xml and then write your own small routine for traversing >> the >> >>> >> dictionary and transforming it into a sympy expression. >> >>> >> >> >>> >> If you do this I am sure that the sympy team would be very >> interested >> >>> >> to have your work merged. >> >>> > >> >>> > Absolutely. Pablo, if you would send us a PR that could do that, >> >>> > that would be awesome. >> >>> > >> >>> > Ondrej >> >>> > >> >>> >> >> >>> >> >> >>> >> On 2 July 2013 18:22, peibol <pab...@gmail.com> wrote: >> >>> >>> Hehe, they don't write the expression in MathML, I'm not that >> kind of >> >>> >>> demon. >> >>> >>> >> >>> >>> They enter expressions in a textarea by means of >> >>> >>> http://mathdox.org/formulaeditor/, from which I can get the >> openmath >> >>> >>> or the >> >>> >>> (presentation) mathml .The web app is for K12 students, well >> 12-16 >> >>> >>> years >> >>> >>> old, so I think this way to enter mathematical expressions is one >> of >> >>> >>> the >> >>> >>> easiest... >> >>> >>> >> >>> >>> El martes, 2 de julio de 2013 18:17:19 UTC+2, Stefan Krastanov >> >>> >>> escribió: >> >>> >>>> >> >>> >>>> This is probably not very helpful, but why require the students >> to >> >>> >>>> write their results in MathML? It is not a very natural way to >> write >> >>> >>>> expression. On the other hand, if you use valid python >> expression it >> >>> >>>> would probably be much easier. >> >>> >>> >> >>> >>> -- >> >>> >>> You received this message because you are subscribed to the >> Google >> >>> >>> Groups >> >>> >>> "sympy" group. >> >>> >>> To unsubscribe from this group and stop receiving emails from it, >> >>> >>> send an >> >>> >>> email to sympy+un...@googlegroups.com. >> >>> >>> To post to this group, send email to sy...@googlegroups.com. >> >>> >>> Visit this group at http://groups.google.com/group/sympy. >> >>> >>> For more options, visit https://groups.google.com/groups/opt_out. >> >> >>> >>> >> >>> >>> >> >>> >> >> >>> >> -- >> >>> >> You received this message because you are subscribed to the Google >> >>> >> Groups "sympy" group. >> >>> >> To unsubscribe from this group and stop receiving emails from it, >> send >> >>> >> an email to sympy+un...@googlegroups.com. >> >>> >> To post to this group, send email to sy...@googlegroups.com. >> >>> >> Visit this group at http://groups.google.com/group/sympy. >> >>> >> For more options, visit https://groups.google.com/groups/opt_out. >> >>> >> >> >>> >> >> >>> > >> >>> > -- >> >>> > You received this message because you are subscribed to the Google >> >>> > Groups "sympy" group. >> >>> > To unsubscribe from this group and stop receiving emails from it, >> send >> >>> > an email to sympy+un...@googlegroups.com. >> >>> > To post to this group, send email to sy...@googlegroups.com. >> >>> > Visit this group at http://groups.google.com/group/sympy. >> >>> > For more options, visit https://groups.google.com/groups/opt_out. >> >>> > >> >>> > >> > >> > -- >> > You received this message because you are subscribed to the Google >> Groups >> > "sympy" group. >> > To unsubscribe from this group and stop receiving emails from it, send >> an >> > email to sympy+un...@googlegroups.com. >> > To post to this group, send email to sy...@googlegroups.com. >> > Visit this group at http://groups.google.com/group/sympy. >> > For more options, visit https://groups.google.com/groups/opt_out. >> > >> > >> > -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sympy+unsubscr...@googlegroups.com. To post to this group, send email to sympy@googlegroups.com. Visit this group at http://groups.google.com/group/sympy. For more options, visit https://groups.google.com/groups/opt_out.