Cómo trabajar con marcado personalizado XML en .NET
Cómo trabajar con marcado personalizado XML en .NET
Un documento de Word puede contener datos personalizados XML junto a su contenido visible — datos utilizados para enlazar controles de contenido, almacenar metadatos específicos de la aplicación o incrustar partes añadidas por otra aplicación. Esta guía muestra cómo leer esos datos, agregar nuevas partes personalizadas XML y examinar las etiquetas inteligentes heredadas que los documentos más antiguos aún pueden contener, usando CustomXmlPart, CustomXmlProperty y SmartTag en Aspose.Words FOSS para .NET.
Guía paso a paso
Paso 1: Leer datos personalizados XML de un documento
Document.CustomXmlParts devuelve un CustomXmlPartCollection — el mismo mecanismo que Word usa para respaldar los controles de contenido mapeados a XML. Itera la colección, o llama a GetById(id) cuando ya sabes qué parte necesitas, para obtener un CustomXmlPart. Cada parte expone Id, una matriz de bytes Data que contiene el XML sin procesar, un DataChecksum para detectar si los datos han cambiado sin una comparación completa de bytes, y Schemas — un CustomXmlSchemaCollection que enumera los esquemas XML asociados a ella.
Paso 2: Agregar o actualizar una parte personalizada XML
Llama a CustomXmlPartCollection.Add(id, xml) con una cadena id y el contenido de XML para crear una parte directamente, o construye un CustomXmlPart por separado y pásalo a Add(part). Para eliminar datos, usa RemoveAt(index) en una posición específica o Clear() para descartar cada parte. Al copiar datos personalizados de XML entre documentos, usa CustomXmlPart.Clone() (o el Clone() de la colección) en la parte origen en lugar de volver a leer y volver a agregar el XML sin procesar, luego agrega el clon al Document.CustomXmlParts del documento de destino.
Paso 3: Gestionar los esquemas asociados a una parte
CustomXmlPart.Schemas llega a un CustomXmlSchemaCollection, que registra los URI de esquemas asociados con la parte como cadenas simples en lugar de objetos de esquema analizados. Usa Add(value) para registrar un URI de esquema, Remove(name) o RemoveAt(index) para eliminar uno, IndexOf(value) para localizar uno, y Clear() para removerlos todos. Count informa cuántos URI de esquemas están actualmente asociados con la parte.
Paso 4: Trabajar con partes personalizadas a nivel de paquete
No todas las partes no visibles en un paquete OOXML son XML personalizados. Document.PackageCustomParts devuelve un CustomPartCollection de objetos CustomPart — partes arbitrarias almacenadas en el paquete, como partes añadidas por otra aplicación que modificó el archivo. Cada CustomPart tiene un Name, ContentType, RelationshipType, una matriz de bytes Data, y una bandera IsExternal que indica si es una referencia externa en lugar de contenido incrustado. Add(part), RemoveAt(index) y Clear() gestionan la colección de la misma manera que CustomXmlPartCollection. Verifica PackageCustomParts — no CustomXmlParts — cuando una parte que tu documento debería contener no aparece en la colección XML personalizada.
Paso 5: Inspeccionar etiquetas inteligentes heredadas y sus propiedades
SmartTag es un tipo de nodo (NodeType.SmartTag, construido con SmartTag(doc)) que representa una etiqueta inteligente heredada de Word envuelta alrededor del texto reconocido. Verifica Element y Uri juntos para identificar qué reconocedor creó la etiqueta, luego lee Properties — un CustomXmlPropertyCollection — para los datos estructurados que el reconocedor adjuntó. Dentro de un CustomXmlPropertyCollection, el indexador (p. ej. properties["MyProp"]) o Contains(name) buscan una propiedad específica, IndexOfKey(name) devuelve su posición, y Remove(name)/RemoveAt(index)/Clear() eliminan entradas; cada CustomXmlProperty se construye con CustomXmlProperty(name, uri, value) y expone Name, Uri y Value. Debido a que SmartTag deriva de CompositeNode, también participa en el árbol del documento como otros nodos, soportando Accept(visitor), AcceptStart(visitor) y AcceptEnd(visitor) para la traversía basada en DocumentVisitor.
Problemas comunes y soluciones
CustomXmlPartCollection.GetById(id) no devuelve nada utilizable. El id no coincide con ninguna parte actualmente en Document.CustomXmlParts. Enumere la colección para confirmar que el id está presente, o agregue la parte primero con Add(id, xml).
Una parte añadida por otra aplicación no se encuentra al iterar CustomXmlParts. Las partes del paquete no-XML se exponen a través de Document.PackageCustomParts, no CustomXmlParts. Verifique PackageCustomParts (a CustomPartCollection) en su lugar.
SmartTag.Properties está vacío aunque la etiqueta está claramente presente. No todos los reconocedores de etiquetas inteligentes adjuntan propiedades estructuradas. Verifique SmartTag.Element and Uri para confirmar qué reconocedor creó la etiqueta antes de asumir que estarán presentes propiedades específicas.
Custom XML data no parece estar relacionado con el control de contenido al que debería estar vinculado. Los controles de contenido se vinculan al XML personalizado mediante su propia configuración de enlace de datos, no automáticamente a cada CustomXmlPart in Document.CustomXmlParts. Confirme a qué parte está realmente vinculado un control de contenido dado, en lugar de asumir una relación uno a uno.
Preguntas frecuentes
¿Cómo añado datos personalizados de XML a un documento?
Llame a Document.CustomXmlParts.Add(id, xml) con una cadena de id y contenido de XML, o construya un CustomXmlPart por separado y páselo a Add(part).
¿Cuál es la diferencia entre CustomXmlPart y CustomXmlProperty?
CustomXmlPart es una isla de datos completa de XML — una carga útil de matriz de bytes más esquemas asociados — a la que se accede a través de Document.CustomXmlParts. CustomXmlProperty es un par nombre/valor único, típicamente accedido a través de SmartTag.Properties en lugar de directamente desde el documento.
¿Cómo copio datos personalizados de XML de un documento a otro?
Llame a Clone() en el CustomXmlPart de origen, luego agregue el clon al Document.CustomXmlParts del documento de destino con Add(part).
¿Qué es un SmartTag y cuándo podría encontrarme con uno?
SmartTag es una función heredada de Word que representa texto reconocido y envuelto por un reconocedor de etiquetas inteligentes — un nodo de documento (NodeType.SmartTag) con un Element y Uri que identifican al reconocedor, más una colección Properties de valores CustomXmlProperty. Aparece en documentos que fueron creados o editados con etiquetas inteligentes habilitadas en versiones anteriores de Word.
¿Cómo sé cuántas partes personalizadas de XML o partes de paquete tiene un documento?
Lea Count en Document.CustomXmlParts (un CustomXmlPartCollection) o Document.PackageCustomParts (un CustomPartCollection) respectivamente.