domingo, 20 de marzo de 2016

Receta C# No. 6-5: Cómo Obtener Nodos XML sobre un Namespace XML Específico

Índice

1. Introducción
2. 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:
Método sobrecargado GetElementsByTagName
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:
Ejecución assembly BusquedaNodoNamespace.exe
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.