将 MathML 解析为简单的数学表达式

Sau*_*kar 2 javascript c# parsing expression mathml

我正在使用MathDox公式编辑器来生成 MathML。现在我想将 MathDox 生成的 MathML 转换为表达式,稍后我可以用它来评估以找到答案。

For eg:

MathML:
<math xmlns='http://www.w3.org/1998/Math/MathML'>
 <mrow>
  <mn>3</mn>
  <mo>+</mo>
  <mn>5</mn>
 </mrow>
</math>

Want to convert to expression as:
3+5
Run Code Online (Sandbox Code Playgroud)

现在我可以用3+5得到答案8。

我正在寻找用于此转换的javascriptc#解决方案。尝试用谷歌搜索,但没有得到太多帮助。我在这里找到了更接近的解决方案,但它也是一个桌面应用程序和商业应用程序。但是,我想要开源网络应用程序解决我的问题。任何帮助将不胜感激。

注意:为了简单起见,我在上面的示例中只提到了简单的加法,但 mathml 也可以包含复杂的表达式,例如导数和日志。

小智 5

这可以通过 JavaScript 中的以下步骤来实现:

\n\n
    \n
  1. 从 MathML 转换为 XML DOM
  2. \n
  3. 从 XML DOM 转换为纯文本
  4. \n
  5. 使用“eval”函数获取表达式的十进制值
  6. \n
\n\n

下面的代码正是这样做的:

\n\n
function getDOM(xmlstring) {\n    parser=new DOMParser();\n    return parser.parseFromString(xmlstring, "text/xml");\n}\n\nfunction remove_tags(node) {\n    var result = "";\n    var nodes = node.childNodes;\n    var tagName = node.tagName;\n    if (!nodes.length) {\n        if (node.nodeValue == "\xcf\x80") result = "pi";\n        else if (node.nodeValue == "\xc2\xa0") result = "";\n        else result = node.nodeValue;\n    } else if (tagName == "mfrac") {\n        result = "("+remove_tags(nodes[0])+")/("+remove_tags(nodes[1])+")";\n    } else if (tagName == "msup") {\n        result = "Math.pow(("+remove_tags(nodes[0])+"),("+remove_tags(nodes[1])+"))";\n    } else for (var i = 0; i < nodes.length; ++i) {\n        result += remove_tags(nodes[i]);\n    }\n\n    if (tagName == "mfenced") result = "("+result+")";\n    if (tagName == "msqrt") result = "Math.sqrt("+result+")";\n\n    return result;\n}\n\nfunction stringifyMathML(mml) {\n   xmlDoc = getDOM(mml);\n   return remove_tags(xmlDoc.documentElement);\n}\n\n// Some testing\n\ns = stringifyMathML("<math><mn>3</mn><mo>+</mo><mn>5</mn></math>");\nalert(s);\nalert(eval(s));\n\ns = stringifyMathML("<math><mfrac><mn>1</mn><mn>2</mn></mfrac><mo>+</mo><mn>1</mn></math>");\nalert(s);\nalert(eval(s));\n\ns = stringifyMathML("<math><msup><mn>2</mn><mn>4</mn></msup></math>");\nalert(s);\nalert(eval(s));\n\ns = stringifyMathML("<math><msqrt><mn>4</mn></msqrt></math>");\nalert(s);\nalert(eval(s));\n
Run Code Online (Sandbox Code Playgroud)\n\n

按照前面的代码,可以扩展已接受的 MathML。例如,添加三角函数或任何其他自定义函数将很容易。

\n\n

出于本文的目的,我使用mathml 编辑器中的工具来构建 MathML(在代码的测试部分中使用)。

\n