Parsing Mathml To Plain Math Expression
I am using MathDox formula editor to produce MathML. Now I want to convert the MathML produced by MathDox to expression which I can later use to evaluate to find the answer. For eg
Solution 1:
This can be achieved using the following steps in JavaScript:
- Convert from MathML to XML DOM
- Convert from XML DOM to plain text
- Use the "eval" function to get the decimal value of the expression
The following code does precisely that:
functiongetDOM(xmlstring) {
parser=newDOMParser();
return parser.parseFromString(xmlstring, "text/xml");
}
functionremove_tags(node) {
var result = "";
var nodes = node.childNodes;
var tagName = node.tagName;
if (!nodes.length) {
if (node.nodeValue == "π") result = "pi";
elseif (node.nodeValue == " ") result = "";
else result = node.nodeValue;
} elseif (tagName == "mfrac") {
result = "("+remove_tags(nodes[0])+")/("+remove_tags(nodes[1])+")";
} elseif (tagName == "msup") {
result = "Math.pow(("+remove_tags(nodes[0])+"),("+remove_tags(nodes[1])+"))";
} elsefor (var i = 0; i < nodes.length; ++i) {
result += remove_tags(nodes[i]);
}
if (tagName == "mfenced") result = "("+result+")";
if (tagName == "msqrt") result = "Math.sqrt("+result+")";
return result;
}
functionstringifyMathML(mml) {
xmlDoc = getDOM(mml);
returnremove_tags(xmlDoc.documentElement);
}
// Some testing
s = stringifyMathML("<math><mn>3</mn><mo>+</mo><mn>5</mn></math>");
alert(s);
alert(eval(s));
s = stringifyMathML("<math><mfrac><mn>1</mn><mn>2</mn></mfrac><mo>+</mo><mn>1</mn></math>");
alert(s);
alert(eval(s));
s = stringifyMathML("<math><msup><mn>2</mn><mn>4</mn></msup></math>");
alert(s);
alert(eval(s));
s = stringifyMathML("<math><msqrt><mn>4</mn></msqrt></math>");
alert(s);
alert(eval(s));
Following the previous code, it is possible to extend the accepted MathML. For example, it would be easy to add trigonometry or any other custom function.
For the purpose of this post, I used the tool from mathml editor to build the MathML (used in the test part of the code).
Post a Comment for "Parsing Mathml To Plain Math Expression"