更新:2007 年 11 月
| 适用对象 | 
|---|
| 本主题中的信息只适用于指定的 Microsoft Office 版本。 Microsoft Office 版本 
 有关更多信息,请参见按应用程序和项目类型提供的功能。 | 
您可以在不启动 Microsoft Office Excel、Microsoft Office PowerPoint 或 Microsoft Office Word 的情况下向文档中添加自定义 XML 部件。如果要将 XML 数据存储在未安装 Microsoft Office 的计算机(如服务器)上的文档中,此方法非常有用。有关更多信息,请参见自定义 XML 部件概述。
文档必须采用 Office Open XML 格式之一,比如 .docx、.xlsx 或 .pptx。您无法在未启动 Microsoft Office 应用程序的情况下访问二进制文件格式中的自定义 XML 部件。
若要在不启动 Microsoft Office 的情况下添加自定义 XML 部件,请使用 Package 和 PackagePart 类。有关这些类的更多信息,请参见 Windows Presentation Foundation 中的文档。
在不启动 Microsoft Office 的情况下向文档中添加自定义 XML 部件
- 创建一个 XmlDocument 对象,该对象表示要添加到自定义 XML 部件的 XML。 - Dim xmlString As String = _ "<?xml version=""1.0"" encoding=""utf-8"" ?>" & _ "<employees https://schemas.microsoft.com/vsto/samples"">" & _ "<employee>" & _ "<name>Karina Leal</name>" & _ "<hireDate>1999-04-01</hireDate>" & _ "<title>Manager</title>" & _ "</employee>" & _ "</employees>" Dim reader As StringReader = New StringReader(xmlString) Dim xmlDoc As XmlDocument = New XmlDocument() xmlDoc.Load(reader)- string xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + "<employees xmlns=\"https://schemas.microsoft.com/vsto/samples\">" + "<employee>" + "<name>Karina Leal</name>" + "<hireDate>1999-04-01</hireDate>" + "<title>Manager</title>" + "</employee>" + "</employees>"; StringReader reader = new StringReader(xmlString); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(reader);
- 创建一个新的 PackagePart,表示要添加到文档的自定义 XML 部件。然后,将之前创建的 XmlDocument 对象中的 XML 保存到新的自定义 XML 部件中。 - Using package As Package = package.Open(fullDocumentPath, FileMode.Open, _ FileAccess.ReadWrite) Dim uriPartTarget As Uri = New Uri("/customXml/employee1.xml", UriKind.Relative) If Not package.PartExists(uriPartTarget) Then Dim customXml As PackagePart = package.CreatePart(uriPartTarget, _ "application/vnd.openxmlformats-officedocument.customXmlProperties+xml") Using partStream As Stream = customXml.GetStream(FileMode.Create, _ FileAccess.ReadWrite) xmlDoc.Save(partStream) End Using End If End Using- using (Package package = Package.Open(fullDocumentPath, FileMode.Open, FileAccess.ReadWrite)) { Uri uriPartTarget = new Uri("/customXml/employee1.xml", UriKind.Relative); if (!package.PartExists(uriPartTarget)) { PackagePart customXml = package.CreatePart(uriPartTarget, "application/vnd.openxmlformats-officedocument.customXmlProperties+xml"); using (Stream partStream = customXml.GetStream(FileMode.Create, FileAccess.ReadWrite)) { xmlDoc.Save(partStream); } } }
示例
下面的代码示例将一个自定义 XML 部件添加到名为 Employees.docx 的 Word 文档中,该文档位于 %UserProfile%\My Documents 文件夹(对于 Windows XP 及早期版本)或 %UserProfile%\Documents 文件夹(对于 Windows Vista)中。
此示例适合在控制台应用程序中使用,但您可以对其进行修改,以在任何使用 .NET Framework 3.0 或更高版本的应用程序(比如 Windows Presentation Foundation (WPF) 应用程序)中工作。
若要修改此示例以与 Excel 或 PowerPoint 文档协同工作,请修改 Main 方法以将文档的完整路径传入到 AddCustomXmlPart 方法。
Sub Main()
    AddCustomXmlPart(Environment.GetFolderPath( _
        Environment.SpecialFolder.MyDocuments) & "\Employees.docx")
End Sub
Private Sub AddCustomXmlPart(ByVal fullDocumentPath As String)
    Dim xmlDoc As XmlDocument = GetXmlDocumentFromString()
    If xmlDoc IsNot Nothing Then
        Using package As Package = package.Open(fullDocumentPath, FileMode.Open, _
            FileAccess.ReadWrite)
            Dim uriPartTarget As Uri = New Uri("/customXml/employee1.xml", UriKind.Relative)
            If Not package.PartExists(uriPartTarget) Then
                Dim customXml As PackagePart = package.CreatePart(uriPartTarget, _
                    "application/vnd.openxmlformats-officedocument.customXmlProperties+xml")
                Using partStream As Stream = customXml.GetStream(FileMode.Create, _
                    FileAccess.ReadWrite)
                    xmlDoc.Save(partStream)
                End Using
            End If
        End Using
    End If
End Sub
Private Function GetXmlDocumentFromString() As XmlDocument
    Dim xmlString As String = _
        "<?xml version=""1.0"" encoding=""utf-8"" ?>" & _
            "<employees https://schemas.microsoft.com/vsto/samples"">" & _
                "<employee>" & _
                    "<name>Karina Leal</name>" & _
                    "<hireDate>1999-04-01</hireDate>" & _
                    "<title>Manager</title>" & _
                "</employee>" & _
            "</employees>"
    Dim reader As StringReader = New StringReader(xmlString)
    Dim xmlDoc As XmlDocument = New XmlDocument()
    xmlDoc.Load(reader)
    Return xmlDoc
End Function
static void Main(string[] args)
{
    AddCustomXmlPart(Environment.GetFolderPath(
        Environment.SpecialFolder.MyDocuments) + @"\Employees.docx");
}
private static void AddCustomXmlPart(string fullDocumentPath)
{
    XmlDocument xmlDoc = GetXmlDocumentFromString();
    if (xmlDoc != null)
    {
        using (Package package = Package.Open(fullDocumentPath, FileMode.Open,
            FileAccess.ReadWrite))
        {
            Uri uriPartTarget = new Uri("/customXml/employee1.xml", UriKind.Relative);
            if (!package.PartExists(uriPartTarget))
            {
                PackagePart customXml = package.CreatePart(uriPartTarget,
                    "application/vnd.openxmlformats-officedocument.customXmlProperties+xml");
                using (Stream partStream = customXml.GetStream(FileMode.Create,
                    FileAccess.ReadWrite))
                {
                    xmlDoc.Save(partStream);
                }
            }
        }
    }
}
private static XmlDocument GetXmlDocumentFromString()
{
    string xmlString =
        "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
        "<employees xmlns=\"https://schemas.microsoft.com/vsto/samples\">" +
            "<employee>" +
                "<name>Karina Leal</name>" +
                "<hireDate>1999-04-01</hireDate>" +
                "<title>Manager</title>" +
            "</employee>" +
        "</employees>";
    StringReader reader = new StringReader(xmlString);
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(reader);
    return xmlDoc;
}
编译代码
- 此示例需要引用 WindowsBase.dll 程序集。.NET Framework 从版本 3.0 开始包括了该程序集。 
- 此示例假定对于以下命名空间具有 using(用于 C#)或 Imports(用于 Visual Basic)语句: - System.IO 
- System.IO.Packaging 
- System.Xml 
 
请参见
任务
如何:使用应用程序级外接程序将自定义 XML 部件添加到文档中