Cómo: Agregar elementos XML personalizados a documentos sin iniciar Microsoft Office

Actualización: noviembre 2007

Se aplica a

La información de este tema sólo se aplica a las versiones de Microsoft Office especificadas.

Versión de Microsoft Office

  • Excel 2007

  • PowerPoint 2007

  • Word 2007

Para obtener más información, vea Características disponibles por aplicación y tipo de proyecto.

Puede agregar un elemento XML personalizado a un documento sin iniciar Microsoft Office Excel, Microsoft Office PowerPoint o Microsoft Office Word. Esto resulta útil si desea almacenar datos XML en un documento ubicado en un equipo que no tiene instalado Microsoft Office, por ejemplo, en un servidor. Para obtener más información, vea Información general sobre los elementos XML personalizados.

El documento debe estar en uno de los formatos XML abiertos, como .docx, .xlsx o .pptx. No se puede obtener acceso a los elementos XML personalizados en formatos de archivo binario sin iniciar la aplicación de Microsoft Office.

Para agregar un elemento XML personalizado sin iniciar Microsoft Office, use las clases Package y PackagePart. Para obtener más información sobre estas clases, vea Documentos en Windows Presentation Foundation.

Para agregar un elemento XML personalizado a un documento sin iniciar Microsoft Office

  1. Cree un objeto XmlDocument que represente el XML que desea agregar a un elemento XML personalizado.

    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);
    
  2. Cree una nueva clase PackagePart que represente el elemento XML personalizado que agrega al documento. A continuación, guarde el XML del objeto XmlDocument que creó anteriormente en el nuevo elemento XML personalizado.

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

Ejemplo

En el ejemplo de código siguiente se agrega un elemento XML personalizado a un documento de Word denominado Employees.docx que está ubicado en la carpeta %UserProfile%\Mis documentos (para Windows XP y versiones anteriores) o en la carpeta %UserProfile%\Documentos (para Windows Vista).

Este ejemplo está pensado para usarlo en una aplicación de consola, pero puede modificarlo para que se pueda usar en cualquier aplicación que funcione con .NET Framework 3.0 o posterior, como una aplicación de Windows Presentation Foundation (WPF).

Para modificar este ejemplo de modo que funcione con un documento de Excel o de PowerPoint, modifique el método Main para pasar la ruta de acceso completa del documento al método 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;
}

Compilar el código

  • En este ejemplo se necesita una referencia al ensamblado WindowsBase.dll. Este ensamblado está incluido en .NET Framework, a partir de la versión 3.0.

  • En este ejemplo se presupone que tiene instrucciones using (para C#) o Imports (para Visual Basic) para los siguientes espacios de nombres:

    • System.IO

    • System.IO.Packaging

    • System.Xml

Vea también

Tareas

Cómo: Agregar elementos XML personalizados a personalizaciones de nivel de documento

Cómo: Agregar elementos XML personalizados a documentos mediante complementos de nivel de aplicación

Conceptos

Información general sobre los elementos XML personalizados