将约会 XML 数据导入 Outlook 约会对象 (Outlook)

此主题说明了如何读取 XML 格式的约会数据,将数据保存到默认日历的 Microsoft Outlook AppointmentItem 对象中,然后在数组中返回约会对象。

| MVP 徽标

|Helmut Obertanner 提供了以下代码示例。 Helmut 是 一位Microsoft最有价值专业人员 ,在 Visual Studio 和 Microsoft Office Outlook Microsoft Microsoft Office 开发工具方面具有专业知识。|

下面的托管代码示例是使用 C# 和 Visual Basic 编写的。 若要运行需调入组件对象模型 (COM) 的 .NET Framework 托管代码示例,您必须使用可定义托管接口并将其映射到对象模型类型库中的 COM 对象的互操作程序集。 对于 Outlook,请使用 Visual Studio 和 Outlook 主互作程序集 (PIA) 。 在运行 Outlook 2013 的托管代码示例之前,请确保已安装 Outlook 2013 PIA 并添加了对 Visual Studio 中 Outlook 15.0 对象库组件的Microsoft引用。 使用适用于 Visual Studio) 的 Office 开发人员工具的 Outlook 外接程序 (类中的以下代码示例 ThisAddIn 。 代码中的 应用程序对象必须是由 提供的受信任 Outlook ThisAddIn.Globals对象。 有关使用 Outlook PIA 开发托管 Outlook 解决方案的详细信息,请参阅 欢迎使用 Outlook 主互作程序集参考。 以下代码示例包含 CreateAppointmentsFromXml 类的 Sample 方法,作为 Outlook 外接程序项目的一部分实现。 每个项目添加到 Outlook PIA,基于 Microsoft.Office.Interop.Outlook命名空间的引用。 方法 CreateAppointmentsFromXml 接受两个输入参数: applicationxml

  • application 是受信任的 Outlook 应用程序 对象。

  • xml 是 XML 字符串或表示有效 XML 文件的路径的字符串。 就以下代码示例而言,XML 使用以下 XML 标记分隔约会数据:

约会数据 分隔 XML 标记
整个约会数据集 <约会>
约会集中的每个约会 <约会>
约会的开始时间 <starttime>
约会的结束时间 <endtime>
约会标题 <主题>
约会位置 <位置>
约会详细信息 <身体>

下面的代码示例展示了 xml 参数的输入数据。

<?xml version="1.0" encoding="utf-8" ?>  
<appointments> 
    <appointment> 
        <starttime>2009-06-01T15:00:00</starttime> 
        <endtime>2009-06-01T16:15:00</endtime> 
        <subject>This is a Test-Appointment</subject> 
        <location>At your Desk</location> 
        <body>Here is the Bodytext</body> 
    </appointment> 
    <appointment> 
        <starttime>2009-06-01T17:00:00</starttime> 
        <endtime>2009-06-01T17:15:00</endtime> 
        <subject>This is a second Test-Appointment</subject> 
        <location>At your Desk</location> 
        <body>Here is the Bodytext</body> 
    </appointment> 
    <appointment> 
        <starttime>2009-06-01T17:00:00</starttime> 
        <endtime>2009-06-01T18:15:00</endtime> 
        <subject>This is a third Test-Appointment</subject> 
        <location>At your Desk</location> 
        <body>Here is the Bodytext</body> 
    </appointment> 
</appointments> 

方法 CreateAppointmentsFromXml 使用 XML 文档对象模型 (DOM) 的 Microsoft COM 实现来加载和处理 xml 提供的 XML 数据。 CreateAppointmentsFromXml 首先检查 xml 是否指定了有效的 XML 数据源。 如果有效,则它将数据加载到 XML 文档 DOMDocument 中。 否则, CreateAppointmentsFromXml 将引发异常。 有关 XML DOM 的详细信息,请参阅 DOM。 对于 XML 数据中由 <约会标记分隔的每个约会> 子节点, CreateAppointmentsFromXml 查找特定标记,使用 DOM 提取数据,并将数据分配给 AppointmentItem 对象的相应属性: StartEndSubjectLocationBody。 然后, CreateAppointmentsFromXml 将约会保存到默认日历。 CreateAppointmentsFromXml使用 System.Collections.Generic 命名空间中 List ( 类型) 类的 Add 方法聚合这些 AppointmentItem 对象。 在该方法处理了 XML 数据中的所有约会后,将在数组中返回 AppointmentItem 对象。 以下是 C# 代码示例。

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Text; 
using System.Xml; 
using Outlook = Microsoft.Office.Interop.Outlook; 
 
namespace OutlookAddIn1 
{ 
    class Sample 
    { 
        Outlook.AppointmentItem[] CreateAppointmentsFromXml(Outlook.Application application, 
                                                            string xml) 
        { 
            // Create a list of appointment objects. 
            List<Outlook.AppointmentItem> appointments = new  
                List<Microsoft.Office.Interop.Outlook.AppointmentItem>(); 
            XmlDocument xmlDoc = new XmlDocument(); 
 
            // If xml is an XML string, create the document directly.  
            if (xml.StartsWith("<?xml")) 
            { 
                xmlDoc.LoadXml(xml); 
            } 
            else if (File.Exists(xml)) 
            { 
                xmlDoc.Load(xml); 
            } 
            else 
            { 
                throw new Exception( 
                    "The input string is not valid XML data or the specified file doesn't exist."); 
            } 
 
            // Select all appointment nodes under the root appointments node. 
            XmlNodeList appointmentNodes = xmlDoc.SelectNodes("appointments/appointment"); 
            foreach (XmlNode appointmentNode in appointmentNodes) 
            { 
 
                // Create a new AppointmentItem object. 
                Outlook.AppointmentItem newAppointment =  
                    (Outlook.AppointmentItem)application.CreateItem(Outlook.OlItemType.olAppointmentItem); 
 
                // Loop over all child nodes, check the node name, and import the data into the  
                // appointment fields. 
                foreach (XmlNode node in appointmentNode.ChildNodes) 
                { 
                    switch (node.Name) 
                    { 
 
                        case "starttime": 
                            newAppointment.Start = DateTime.Parse(node.InnerText); 
                            break; 
 
                        case "endtime": 
                            newAppointment.End = DateTime.Parse(node.InnerText); 
                            break; 
 
                        case "subject": 
                            newAppointment.Subject = node.InnerText; 
                            break; 
 
                        case "location": 
                            newAppointment.Location = node.InnerText; 
                            break; 
 
                        case "body": 
                            newAppointment.Body = node.InnerText; 
                            break; 
 
                    } 
                } 
 
                // Save the item in the default calendar. 
                newAppointment.Save(); 
                appointments.Add(newAppointment); 
            } 
 
            // Return an array of new appointments. 
            return appointments.ToArray(); 
        } 
 
    } 
}

以下是 Visual Basic 代码示例。

Imports System.IO 
Imports System.Xml 
Imports Outlook = Microsoft.Office.Interop.Outlook 
 
Namespace OutlookAddIn2 
    Class Sample 
        Function CreateAppointmentsFromXml(ByVal application As Outlook.Application, _ 
            ByVal xml As String) As Outlook.AppointmentItem() 
 
            Dim appointments As New List(Of Outlook.AppointmentItem) 
            Dim xmlDoc As New XmlDocument() 
 
            If xml is an XML string, create the XML document directly. 
            If xml.StartsWith("<?xml") Then 
                xmlDoc.LoadXml(xml) 
            ElseIf (File.Exists(xml)) Then 
                xmlDoc.Load(xml) 
            Else 
                Throw New Exception("The input string is not valid XML data or the specified file doesn't exist.") 
            End If 
 
 
            ' Select all appointment nodes under the root appointments node. 
            Dim appointmentNodes As XmlNodeList = xmlDoc.SelectNodes("appointments/appointment") 
 
            For Each appointmentNode As XmlNode In appointmentNodes 
 
                ' Create a new AppointmentItem object. 
                Dim newAppointment As Outlook.AppointmentItem = _ 
                    DirectCast(application.CreateItem(Outlook.OlItemType.olAppointmentItem), _ 
                    Outlook.AppointmentItem) 
 
                ' Loop over all child nodes, check the node name, and import the data into the appointment fields. 
 
                For Each node As XmlNode In appointmentNode.ChildNodes 
                    Select Case (node.Name) 
 
                        Case "starttime" 
                            newAppointment.Start = DateTime.Parse(node.InnerText) 
 
 
                        Case "endtime" 
                            newAppointment.End = DateTime.Parse(node.InnerText) 
 
 
                        Case "subject" 
                            newAppointment.Subject = node.InnerText 
 
 
                        Case "location" 
                            newAppointment.Location = node.InnerText 
 
 
                        Case "body" 
                            newAppointment.Body = node.InnerText 
 
 
                    End Select 
                Next 
 
                ' Save the item in the default calendar. 
                newAppointment.Save() 
                appointments.Add(newAppointment) 
            Next 
 
            ' Return an array of new appointments. 
            Return appointments.ToArray() 
        End Function 
 
 
    End Class 
End Namespace

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。