Índice
1. Introducción2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 Namespace
5.2 El método sobrecargado GetElementsByTagName
6. Práctica: Búsqueda de Nodos en un Namespace
7. Conclusiones
8. Literatura & Enlaces
1. Introducción
Sobre esta nueva receta C# -de la serie de recetas de manipulación de documentos XML-, se demuestra cómo obtener los nodos de un documento XML especificando un nombre de espacio (o namespace) definido en la estructura del documento. Como se describe en la sección práctica, el uso de la versión sobrecargada de XmlDocument.GetElementsByTagName, además de permitir la especificación del nombre de una etiqueta, admite como argumento adicional el nombre de espacio sobre el que realizar la búsqueda.
2. Palabras Clave
- Documento XML
- Método sobrecargado
- Namespace
- Nodo
- XML
3. Problema
Se requiere un mecanismo de obtención de los nodos de un documento XML que cumplan con la especificación de un namespace.
4. Solución
En C# se cuenta con el método XmlDocument.GetElementsByTagName sobrecargado que admite:
- nombre de la etiqueta a buscar, y
- namespace (o nombre de espacio).
5. Discusión de la Solución
5.1 Namespace
La función de un namespace -o nombre de espacio-, es proporcionar la unicidad de nombres para los elementos que componen la estructura de un documento XML ("Espacio de nombrs XML", 2016).
A lo anterior hay que agregar que un documento XML podrían aparecer elementos que poseen el mismo nombre; entonces para evitar las ambigüedades de nomenclatura los namespace pueden referenciar entidades siguiendo el nombre completamente calificado; como en:
Producto.ID
Cliente.ID
5.2 El método sobrecargado GetElementsByTagName
El método GetElementsByTagName ("XmlDocument.GetElementsByTagName", 2016) cuenta con las siguientes versiones sobrecargadas:
Tabla 1. Método sobrecargado GetElementsByTagName ("XmlDocument.GetElementsByTagName", 2016). |
Para esta receta es de interés la segunda versión:
public virtual XmlNodeList GetElementsByTagName(string localName, string namespaceURI)
Parámetros:
- localName: nombre de la etiqueta a buscar. Al especificar "*" (asterisco) como cadena de búsqueda se encontrarán todos las etiquetas (nodos) dentro del namespace namespaceURI.
- namespaceURI: namespace sobre el cual realizar la búsqueda.
6. Práctica: Búsqueda de Nodos en un Namespace
Primero se definirá un documento XML con una estructura compuesta por la información de identidades cliente y pedido. A continuación, a través de una aplicación de consola se recuperará los nodos XML que cumplan con la especificación de un namespace.
En la línea 3 y 4 se especifican los nombres de espacio
- http://ortizolcom.co/recetas/ns/cliente
- http://ortizol.com.co/recetas/ns/pedido
para cliente y pedido, respectivamente. Nótese cómo en las líneas 6-8 se usa el prefijo cli seguido de dos puntos (:) y el nombre de la etiqueta:
- cli:numero_ID
- cli:nombre
- cli:telefono
De manera análoga para el prefijo ped (líneas 10-12).
En la líneas 11-12 se carga el documento XML ClientePedido.xml. Con la invocación del método GetElementsByTagName (líneas 15-16) se busca por todos los nodos del namespace http://ortizol.com.co/recetas/ns/pedido.
Con las líneas 23-39 se itera todos los nodos de la lista que contiene los resultados y se muestra su nombre, atributos, y valores.
Compilación:
csc /t:exe BusquedaNodoNamespace.cs
Ejecución assembly:
.\BusquedaNodoNamespace.exe
Demostración ejecución assembly:
Figura 2. Ejecución assembly BusquedaNodoNamespace.exe. |
7. Conclusiones
En esta receta se ha comprendido cómo realizar una búsqueda de nodos especificando un namespace de un documento XML. La versión método GetElementsByTagName permitió este tipo de búsqueda de manera muy intuitiva: nombre del elemento y el namespace.
La próxima receta C# se centra en la búsqueda de elementos con la mecanismo XPath.
8. Literatura & Enlaces
Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.Espacio de nombres XML (2016, marzo 20). Recuperado desde: https://es.wikipedia.org/wiki/Espacio_de_nombres_XML
XmlDocument.GetElementsByTagName Method (System.Xml) (2016, marzo 20). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.xml.xmldocument.getelementsbytagname(v=vs.110).aspx
V
No hay comentarios:
Publicar un comentario
Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.