如何将WordOpenXML属性转换为System.IO.Packaging.Package?

Jez*_*Jez 6 c# outlook add-in ms-word visual-studio

我一直在尝试使用Visual Studio 2008在C#中构建Outlook 2010插件.我能够Microsoft.Office.Interop.Word.DocumentClassMicrosoft.Office.Interop.Outlook.Inspector对象中获取一个对象,该对象代表当前正在编辑的电子邮件.我知道这DocumentClass也用于其他各种情况(通常用于Microsoft Word扩展,不出所料).

该类有一个被调用的属性WordOpenXML,它似乎是构成该.docx包的所有文件的XML表示,当将该Word文档另存为时,该文件将保存到磁盘.docx.

这个属性非常有用的一种方法是它是否可以转换成System.IO.Packaging.Package内存中的对象; 即.反序列化它.有谁知道是否有一种简单的方法可以做到这一点,还是我需要编写一些XML解析代码来手动完成它?

Jez*_*Jez 5

我最后修改了一些我在网上找到的代码来创建一个转换WordOpenXML为Package 的方法,该方法保存到磁盘:

using System;
using System.Xml;
using System.Xml.XPath;
using System.Text;
using System.IO;
using System.IO.Packaging;

// [...]
// Call like this: createPackageFromWordOpenXML(wordEditor.WordOpenXML, @"C:\outputFiles\testOut.docx");

/// <summary>
/// Creates a ZIP package (ie. Word's .docx format) from a WordOpenXML string, which is saved to the file at the path specified.
/// </summary>
/// <param name="wordOpenXML">The WordOpenXML string to get the ZIP package data from.</param>
/// <param name="filePath">The path of the file to save the ZIP package to.</param>
private void createPackageFromWordOpenXML(string wordOpenXML, string filePath)
{
    string packageXmlns = "http://schemas.microsoft.com/office/2006/xmlPackage";
    Package newPkg = System.IO.Packaging.ZipPackage.Open(filePath, FileMode.Create);

    try
    {
        XPathDocument xpDocument = new XPathDocument(new StringReader(wordOpenXML));
        XPathNavigator xpNavigator = xpDocument.CreateNavigator();

        XmlNamespaceManager nsManager = new XmlNamespaceManager(xpNavigator.NameTable);
        nsManager.AddNamespace("pkg", packageXmlns);
        XPathNodeIterator xpIterator = xpNavigator.Select("//pkg:part", nsManager);

        while (xpIterator.MoveNext())
        {
            Uri partUri = new Uri(xpIterator.Current.GetAttribute("name", packageXmlns), UriKind.Relative);

            PackagePart pkgPart = newPkg.CreatePart(partUri, xpIterator.Current.GetAttribute("contentType", packageXmlns));

            // Set this package part's contents to this XML node's inner XML, sans its surrounding xmlData element.
            string strInnerXml = xpIterator.Current.InnerXml
                .Replace("<pkg:xmlData xmlns:pkg=\"" + packageXmlns + "\">", "")
                .Replace("</pkg:xmlData>", "");
            byte[] buffer = Encoding.UTF8.GetBytes(strInnerXml);
            pkgPart.GetStream().Write(buffer, 0, buffer.Length);
        }

        newPkg.Flush();
    }
    finally
    {
        newPkg.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)