Проблема с вашим кодом в том, что вы не перемещаетесь вниз по элементам. Вот метод, который будет анализировать mathml с помощью рекурсии вместо стеков. Метод стека не работает хорошо, когда оператор может быть применен к нескольким операндам, что имеет место с плюсом, который применяется к 5 ^ 2 и 4 * 2 и к окончательному 4.
public string ReadMathXml(XElement element)
{
switch(element.Name.LocalName)
{
// There should be one apply inside of a row
case "mrow":
return ReadMathXml(element.Element("apply"));
// The apply should have one operator followed by multiple operands
case "apply":
var elements = element.Elements();
var op = ReadMathXml(elements.First());
var operands = elements.Skip(1).Select(x => ReadMathXml(x));
return string.Join(op, operands);
// Add more operators as needed.
case "plus": return "+";
case "power": return "^";
case "eq": return "=";
case "times" : return "*";
// Add any other operand names here.
case "ci" :
case "cn" : return element.Value;
}
// we should not get here.
return null;
}
Тогда, если вы позвоните с этим кодом
var doc = XDocument.Parse(@"<mrow>
<apply>
<eq/>
<apply>
<plus/>
<apply>
<power/>
<ci>5</ci>
<cn>2</cn>
</apply>
<apply>
<times/>
<cn>4</cn>
<ci>2</ci>
</apply>
<cn>4</cn>
</apply>
<cn>0</cn>
</apply>
</mrow>");
var result = ReadMathXml(doc.Root);
Результат будет
5 ^ 2 + 4 * 2 + 4 = 0
Обратите внимание, что вам понадобится using System.Xml.Linq;
, чтобы использовать XDocument
и XElement
.