5

我只想读取用于生成方程的 xml,我使用Paragraph.Range.WordOpenXML. 但是用于等式的部分MathML与我发现Equation的 microsoft 中的部分不同MathML

我是否需要使用一些特殊的转换器来获得所需的 xml 或有其他方法吗?

4

1 回答 1

6

您可以使用该OMML2MML.XSL文件(位于 下%ProgramFiles%\Microsoft Office\Office15)将Word 文档中包含的Microsoft Office MathML (方程式)转换为MathML

下面的代码显示了如何使用以下步骤将 word 文档中的方程转换为 MathML:

  1. 使用 OpenXML SDK(2.5 版)打开 word 文档。
  2. 创建一个 XslCompiledTransform 并加载 OMML2MML.XSL 文件。
  3. 通过在创建的 XslCompiledTransform 实例上调用 Transform() 方法来转换 word 文档。
  4. 输出转换的结果(例如在控制台上打印或写入文件)。

我已经用一个包含两个方程、文本和图片的简单 Word 文档测试了下面的代码。

using System.IO;
using System.Xml;
using System.Xml.Xsl;
using DocumentFormat.OpenXml.Packaging;

public string GetWordDocumentAsMathML(string docFilePath, string officeVersion = "14")
{
    string officeML = string.Empty;
    using (WordprocessingDocument doc = WordprocessingDocument.Open(docFilePath, false))
    {
        string wordDocXml = doc.MainDocumentPart.Document.OuterXml;

        XslCompiledTransform xslTransform = new XslCompiledTransform();

        // The OMML2MML.xsl file is located under 
        // %ProgramFiles%\Microsoft Office\Office15\
        xslTransform.Load(@"c:\Program Files\Microsoft Office\Office" + officeVersion + @"\OMML2MML.XSL");

        using (TextReader tr = new StringReader(wordDocXml))
        {
            // Load the xml of your main document part.
            using (XmlReader reader = XmlReader.Create(tr))
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    XmlWriterSettings settings = xslTransform.OutputSettings.Clone();

                    // Configure xml writer to omit xml declaration.
                    settings.ConformanceLevel = ConformanceLevel.Fragment;
                    settings.OmitXmlDeclaration = true;

                    XmlWriter xw = XmlWriter.Create(ms, settings);

                    // Transform our OfficeMathML to MathML.
                    xslTransform.Transform(reader, xw);
                    ms.Seek(0, SeekOrigin.Begin);

                    using (StreamReader sr = new StreamReader(ms, Encoding.UTF8))
                    {
                        officeML = sr.ReadToEnd();
                        // Console.Out.WriteLine(officeML);
                    }
                }
            }
        }
    }
    return officeML;
}

要仅转换一个方程(而不是整个 Word 文档),只需查询所需的Office 数学段落 (m:oMathPara)并使用OuterXML此节点的属性。下面的代码显示了如何查询第一个数学段落:

string mathParagraphXml = 
      doc.MainDocumentPart.Document.Descendants<DocumentFormat.OpenXml.Math.Paragraph>().First().OuterXml;

使用返回的 XML 来提供TextReader.

于 2013-05-27T16:56:32.087 回答