【问题标题】:parsing xml to get the equation to be returned to python解析 xml 以获取要返回给 python 的方程
【发布时间】:2015-09-08 07:16:29
【问题描述】:

这是一个将 xml 文件转换为文本的 javascript 文件。此文本通常是方程式。我希望此方程式能够使传递给 python 的 xml 的结果产生所需的结果。任何帮助都是可观的。

function getDOM(xmlstring) {
    parser=new DOMParser();
    return parser.parseFromString(xmlstring, "text/xml");
}
function remove_tags(node) {
    var result = "";
    var nodes = node.childNodes;
    var tagName = node.tagName;
    if (!nodes.length) {
        if (node.nodeValue == "π") result = "pi";
        else if (node.nodeValue == " ") result = "";
        else result = node.nodeValue;
    } else if (tagName == "mfrac") {
        result = "("+remove_tags(nodes[0])+")/("+remove_tags(nodes[1])+")";
    } else if (tagName == "msup") {
        result = "Math.pow(("+remove_tags(nodes[0])+"),("+remove_tags(nodes[1])+"))";
    } else for (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;
}
function stringifyMathML(mml) {
   xmlDoc = getDOM(mml);
   return remove_tags(xmlDoc.documentElement);
}

xml文件示例

s = stringifyMathML(" <math><mi>sin</mi><mfenced><mi>x</mi></mfenced></math>");
        alert(s);
        alert(eval(s));

我期望输出是 ma​​th.sin(x)

【问题讨论】:

  • @Baart 我在第 25 行输入了这个 else if (tagName == "sin") { result = "math.sin("+remove_tags(nodes[0])+")";跨度>
  • 现在的结果是“sin(x)”,对吗?你错过了“数学”。部分?
  • 是的,我需要数学。部分

标签: javascript python xml parsing mathml


【解决方案1】:

添加特定的 .math 部分将解决问题:

“数学”。仅当存在特殊关键字时才必须添加部分。 因此,首先,构建您需要在列表中涵盖的潜在操作 (mList)

那么,如果你遇到这个操作,在它前面加上“.math”

var mList = ['pow', 'sin', 'cos', 'pow', 'sqrt', 'π'];

function getDOM(xmlstring) {
    parser=new DOMParser();
    return parser.parseFromString(xmlstring, "text/xml");
}
function remove_tags(node) {
    var result = "";
    var nodes = node.childNodes;
    var tagName = node.tagName;
    if (!nodes.length) {
        if(mList.indexOf(node.nodeValue) != -1 ) {
            result += 'math.'
        }
        if (node.nodeValue == "π") result += "pi";
        else if (node.nodeValue == " ") result += "";
        else result += node.nodeValue;
    } else if (tagName == "mfrac") {
        result += "("+remove_tags(nodes[0])+")/("+remove_tags(nodes[1])+")";
    } else if (tagName == "msup") {
        result += "pow(("+remove_tags(nodes[0])+"),("+remove_tags(nodes[1])+"))";
    } else for (var i = 0; i < nodes.length; ++i) {
        result += remove_tags(nodes[i]);
    }
    if (tagName == "mfenced") result = "("+result+")";
    if (tagName == "msqrt") result = "sqrt("+result+")";

    console.log('returning', result)
    return result;
}
function stringifyMathML(mml) {
   xmlDoc = getDOM(mml);
   return remove_tags(xmlDoc.documentElement);
}

a = stringifyMathML("<math><mi>x</mi></math>");
b = stringifyMathML("<math><mi>x</mi><mo>+</mo><mn>5</mn></math> ");
c = stringifyMathML("<math><mi>sin</mi><mfenced><mi>x</mi></mfenced></math> ");


console.log(a, 'vs x');
console.log(b, 'vs x+5');
console.log(c, 'vs math.sin(x)');

输出

x 与 x

x+5 与 x+5

math.sin(x) 与 math.sin(x)

【讨论】:

  • @Barrt ,但是当我输入 x 时,我得到的输出为 math.x。只有三角函数我应该得到一个数学。附上
  • 你能添加更多相关的测试/输入吗?
  • 你为什么使用“Math.sqrt”和一个大写 M ?你如何处理输出?
  • @bratt M 是个错误,应该是小 m
  • 输入 x 输出:x 输入 x+ 5 输出:x+5 .input sinx 输出 sin(x )。输入是数学形式
猜你喜欢
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多