如何在WordOpenXML的输出中解析mathML?

时间:2013-05-26 12:11:14

标签: c# ms-word openxml openxml-sdk equations

我想只读取用于生成等式的xml,这是我使用Paragraph.Range.WordOpenXML获得的。但是用于等式的部分不是MathML,因为我发现微软的Equation位于MathML

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

1 个答案:

答案 0 :(得分: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. 通过调用Transform()方法转换word文档  在创建的XslCompiledTransform实例上。
  4. 输出转换结果(例如,在控制台上打印或写入文件)。
  5. 我用一个包含两个方程式,文本和图片的简单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 Math Paragraph(m:oMathPara),并使用此节点的OuterXML属性。 下面的代码显示了如何查询第一个数学段落:

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

    使用返回的XML提供TextReader