Compartir a través de


Importar datos XML de una cita en objetos de citas de Outlook

En este tema se muestra cómo leer datos de citas con marcado XML, guardar los datos en objetos Outlook AppointmentItem del calendario predeterminado y devolver los objetos de citas en una matriz.

Ejemplo

Nota:

Helmut Obertanner proporciona los siguientes ejemplos de código. Los conocimientos de Helmut están en Office Developer Tools para Visual Studio y Outlook.

Los ejemplos de código siguientes contienen el método CreateAppointmentsFromXml de la clase Sample, implementado como parte de un proyecto de complemento de Outlook. Cada proyecto agrega una referencia al ensamblado de interoperabilidad primario de Outlook, que se basa en el espacio de nombres Microsoft.Office.Interop.Outlook.

El método CreateAppointmentsFromXml acepta dos parámetros de entrada:

  • application es un objeto Application de Outlook de confianza.

  • xml es una cadena XML o una cadena que representa una ruta de acceso a un archivo XML válido. Para el fin de los siguientes ejemplos de código, el código XML delimita los datos de cita mediante las siguientes etiquetas XML:

    Datos de la cita

    Etiqueta XML delimitadora

    Todo el conjunto de datos de la cita

    appointments

    Cada cita del conjunto

    appointment

    Hora de inicio de una cita

    starttime

    Hora de finalización de una cita

    endtime

    Título de una cita

    subject

    Ubicación de una cita

    location

    Detalles de una cita

    body

En el ejemplo siguiente se muestran los datos de entrada para el parámetro 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>

El método CreateAppointmentsFromXml usa la implementación COM de Microsoft del modelo de objetos de documento (DOM) XML para cargar y procesar los datos XML que proporciona xml. CreateAppointmentsFromXml comprueba en primer lugar si xml especifica un origen de datos XML válido. En ese caso, carga los datos en un documento XML (DOMDocument). De lo contrario, CreateAppointmentsFromXml genera una excepción. Para obtener más información sobre XML DOM, vea DOM.

Para cada nodo secundario de cita delimitado por la etiqueta appointment en los datos XML, CreateAppointmentsFromXml busca etiquetas específicas, usa DOM para extraer los datos y los asigna a las propiedades correspondientes de un objeto AppointmentItem: Start, End, Subject, Location y Body. A continuación, CreateAppointmentsFromXml guarda la cita en el calendario predeterminado.

CreateAppointmentsFromXml usa el método Add de la clase List<T> en el espacio de nombres System.Collections.Generic para agregar estos objetos AppointmentItem. Cuando el método ha procesado todas las citas de los datos XML, devuelve los objetos AppointmentItem en una matriz.

Si usa Visual Studio para probar este ejemplo de código, primero debe agregar una referencia al componente de la biblioteca de objetos de Microsoft Outlook 15.0 y especificar la variable de Outlook al importar el espacio de nombres Microsoft.Office.Interop.Outlook. La instrucción Imports o using no deben producirse directamente antes de las funciones en el ejemplo de código, pero deben agregarse antes de la declaración de clase pública. Las líneas siguientes de código muestran cómo realizar la importación y la asignación en Visual Basic y C#.

Imports Outlook = Microsoft.Office.Interop.Outlook
using Outlook = Microsoft.Office.Interop.Outlook;

El siguiente es el ejemplo de código de Visual Basic, seguido por el ejemplo de código de C#.

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
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();
        }

    }
}

Vea también