Member 12484974 Ответов: 1

Как преобразовать mathml в поток слов с помощью C#?


как я могу преобразовать теги MathMl в поток слов (string)
например:

<mml:math xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"><mml:msqrt><mml:msup><mml:mrow><mml:mi>a</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo>+</mml:mo><mml:msup><mml:mrow><mml:mi>b</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:msqrt></mml:math>

как я могу преобразовать последнюю формулу в строку типа " sqrt(a^2+b^2)"

я использовал MMLtoCSharp, но он преобразует формулу в такой код:
двойной а = 0,0;
двойной b = 0.0;
Математика.Корень(*а*а+б*б);

Richard MacCutchan

я хочу построить математическую поисковую систему для своей магистерской диссертации
Тогда от вас ожидают выполнения работы. В противном случае это не ваш тезис

пожалуйста, помогите мне
Люди здесь помогут вам, но вам нужно задать конкретный вопрос. Никто не собирается писать вашу диссертацию или разрабатывать ваш код.

Member 12484974

что мне нужно, это подзадача из моего проекта

Richard MacCutchan

Извините, я не понимаю этого комментария.

[no name]

Взгляните на эту статью : http://www.codeproject.com/Articles/30615/Converting-math-equations-to-C

Sergey Alexandrovich Kryukov

Это будет справедливый ответ. Будете ли вы публиковать его с надлежащей атрибуцией в качестве формального ответа, используя "добавить свое решение здесь"?
—СА

1 Ответов

Рейтинг:
6

Sergey Alexandrovich Kryukov

Если вы хотите сделать это в какой-то разумной степени (см. следующий абзац), это не очень трудно сделать, но это будет большая работа.

Что еще более важно, большинство продвинутых символических математических сущностей не могут быть переведены в выражение на любом алгоритмическом языке. Одним из основных примеров является Интеграл. Конечно, если это, скажем, интеграл от sin (x) dx, то это можно сделать, но в общем случае это теоретически невозможно.

Итак, если вы хотите ограничить такое преобразование ограниченным набором математических операций, примерно соответствующих набору .NET BCL System.Math операции и отклонить все остальные случаи вы можете сами. В конце концов, MathML выражается в XML, который представляет собой дерево выражения (бинарное дерево выражения ). Вы можете использовать любую из библиотек синтаксического анализа XML для анализа кода MathML в своего рода DOM. Из этого DOM вы можете сгенерировать строки C#. Отношения родитель-потомок между узлами будут определять структуру выражения, порядок и скобки (), а текстовые узлы будут представлять узлы терминального выражения (например, "2" в вашем примере) или имена переменных.

Обратите внимание, что некоторые сущности MathML не имеют ничего общего с математическими выражениями. Одним из примеров является понятие "строка", которое связано как раз с графическим представлением. Вы можете эффективно игнорировать эту проблему, рассматривая такой узел как регулярное подвыражение. Вы просто берете в скобках вывод, без какой-либо операции (вы можете рассматривать подвыражение без операции как "тривиальное" подвыражение, унарную операцию, которая ничего не делает). Конечно, вы можете получить много лишних круглых скобок; вы можете решить, оптимизировать его или нет.

Синтаксис и семантика MathML полностью описаны здесь: В3 Математика.

Это все, что вам нужно.

—СА