I am trying to render algebra as an SVG using sympy and svgmath. I have the file 'svgmath.xml' in the root directory. Unfortunately I get: 'ImportError: No module named libxml2'. I'm not sure of the best way to sort this out. I would much appreciate any help/advice. My code is:
from xml import sax
from xml.sax.saxutils import XMLGenerator
from svgmath.tools.saxtools import XMLGenerator, ContentFilter
from svgmath.mathhandler import MathHandler, MathNS
from svgmath.tools.saxtools import XMLGenerator
from sympy.printing.mathml import mathml
from sympy.abc import x
from sympy.utilities.mathml import c2p
# Open all files
output = open("test.svg", "w")
config = open("svgmath.xml", "r")
# Create the converter as a content handler.
saxoutput = XMLGenerator(output, 'utf-8')
handler = MathHandler(saxoutput, config)
# Parse input file with a namespace-aware SAX parser
parser = sax.make_parser()
parser.setFeature(sax.handler.feature_namespaces, 1)
parser.setContentHandler(handler)
parser.parse(c2p(mathml(3*x), simple=False))
The Stack trace is now:
Traceback (most recent call last):
File "D:\Geddes\my python\SVGmath\test1.py", line 29, in <module>
parser.parse(c2p(mathml(3*x), simple=True))
File "C:\Python27\lib\xml\sax\expatreader.py", line 102, in parse
source = saxutils.prepare_input_source(source)
File "C:\Python27\lib\xml\sax\saxutils.py", line 298, in prepare_input_source
f = urllib.urlopen(source.getSystemId())
File "C:\Python27\lib\urllib.py", line 84, in urlopen
return opener.open(url)
File "C:\开发者_Python百科Python27\lib\urllib.py", line 202, in open
return self.open_unknown(fullurl, data)
File "C:\Python27\lib\urllib.py", line 214, in open_unknown
raise IOError, ('url error', 'unknown url type', type)
IOError: [Errno url error] unknown url type: '?xml%20version=%221.0%22?%3e%0a%3cmath%20xmlns=%22http'
My modified code:
from xml import sax
from xml.sax.saxutils import XMLGenerator
from svgmath.tools.saxtools import XMLGenerator, ContentFilter
from svgmath.mathhandler import MathHandler, MathNS
from svgmath.tools.saxtools import XMLGenerator
from sympy.printing.mathml import mathml
from sympy.abc import x
from sympy.utilities.mathml import c2p
import libxml2
import StringIO
# Open all files
output = open("test.svg", "w")
config = open("svgmath.xml", "r")
# Create the converter as a content handler.
saxoutput = XMLGenerator(output, 'utf-8')
handler = MathHandler(saxoutput, config)
# Parse input file with a namespace-aware SAX parser
parser = sax.make_parser()
parser.setFeature(sax.handler.feature_namespaces, 1)
parser.setContentHandler(handler)
parser.parse(StringIO.StringIO(mathml(3*x)))
This fails to produce a valid SVG file and gives:
[WARNING] line 1, column 0: Root element in MathML document must be 'math'
[WARNING] line 1, column 7: MathML element 'times' is unsupported
[WARNING] line 1, column 15: MathML element 'cn' is unsupported
[WARNING] line 1, column 25: MathML element 'ci' is unsupported
[WARNING] line 1, column 0: MathML element 'apply' is unsupported
Install the libxml2
library. For example, on ubuntu this is the python-libxml2
package. I too tried the sympy -> mathml -> svg route once, I also had to install the package (iirc it's needed for c2p()
, which applies a XSLT to convert content to presentation MathML).
精彩评论