Cómo analizar archivos XML usando PowerShell

  1. Use Select-Xml para Analizar Archivos XML Usando PowerShell
  2. Use la Clase System.Xml.XmlDocument para Analizar Archivos XML Usando PowerShell
  3. Use la Clase System.Xml.XmlTextReader para Analizar Archivos XML Usando PowerShell
  4. Conclusión
Cómo analizar archivos XML usando PowerShell

El Lenguaje de Marcado Extensible o formato XML sigue siendo ampliamente utilizado hoy en día. Los archivos de configuración, las fuentes RSS y los archivos de Office son solo algunos ejemplos que utilizan el formato XML.

Analizar XML en PowerShell es una tarea común, a menudo requerida para tareas como extracción de datos, gestión de configuraciones y automatización. Si bien PowerShell ofrece varios métodos para analizar XML, cada método tiene sus fortalezas y casos de uso.

En este artículo, exploraremos tres métodos para analizar XML en PowerShell: utilizando el cmdlet Select-Xml, la clase System.Xml.XmlDocument y la clase System.Xml.XmlTextReader. Proporcionaremos ejemplos y explicaciones detalladas para cada método, destacando su sintaxis, funcionalidad y aplicaciones prácticas.

Use Select-Xml para Analizar Archivos XML Usando PowerShell

Analizar Elementos XML en PowerShell

Primero, cubramos una de las formas más populares y sencillas de usar PowerShell para analizar XML con Select-XML. El comando Select-Xml de PowerShell nos permite proporcionar un archivo o cadena XML y un filtro XPath para extraer información específica.

Tenemos un archivo XML en muchas PC que nos gustaría analizar con PowerShell. Por ejemplo, cada máquina tiene un nombre, una dirección IP y un elemento Include que se puede utilizar en un informe.

Ejemplo de XML:

<Computers>
	<Computer>
		<Name>WINPC-01</Name>
		<Ip>127.0.0.1</Ip>
		<Include>true</Include>
	</Computer>
	<Computer>
		<Name>WINPC-02</Name>
		<Ip>192.168.1.105</Ip>
		<Include>false</Include>
	</Computer>
	<Computer>
		<Name>WINPC-03</Name>
		<Ip>192.168.1.104</Ip>
		<Include>true</Include>
	</Computer>
</Computers>

Queremos usar PowerShell para analizar este archivo XML y obtener los nombres de las computadoras. Para hacerlo, podríamos usar el comando Select-XML.

Por ejemplo, en el archivo anterior, los nombres de computadora aparecen en el texto interno (InnerXML) del elemento Name.

Primero proporcionaríamos el XPath adecuado para encontrar los nombres de las computadoras. Solo los nodos Name contenidos en los elementos Computer se devolverían utilizando esta técnica de XPath.

Código de Ejemplo:

Select-Xml -Path sample.xml -XPath '/Computers/Computer/Name' | ForEach-Object { $_.Node.InnerXML }

Usamos Select-Xml para buscar en el archivo XML ubicado en C:\path\sample.xml nodos que coincidan con la expresión XPath '/Computers/Computer/Name'. Esta expresión XPath instruye a PowerShell para seleccionar todos los elementos <Name> dentro de cada elemento <Computer> bajo el nodo raíz <Computers>.

Luego utilizamos el cmdlet ForEach-Object para iterar sobre los resultados devueltos por el cmdlet Select-Xml. Dentro de este bucle, accedemos a la propiedad InnerXML de cada nodo coincidente.

Esta propiedad contiene el contenido de texto interno del elemento XML, lo que nos permite extraer los datos deseados.

Salida:

powershell analizar xml - salida 1

Analizar Atributos XML en PowerShell

Ahora, adoptemos un nuevo enfoque para localizar los nombres de las computadoras. En lugar de ser representados por elementos XML, los descriptores de las computadoras se expresan directamente a través de atributos XML.

A continuación se muestra un archivo XML de ejemplo con descriptores de computadoras representados con atributos. Ahora podemos ver cada descriptor como un atributo en lugar de un elemento.

Ejemplo de XML:

<Computers>
	<Computer name="WINPC-01" ip="127.0.0.1" include="true" />
	<Computer name="WINPC-02" ip="192.168.1.104" include="false" />
	<Computer name="WINPC-03" ip="192.168.1.105" include="true" />
</Computers>

Dado que cada descriptor es un atributo, ajustamos el XPath solo para encontrar los elementos Computer. Luego, utilizando un cmdlet ForEach-Object, encontramos el valor del atributo name.

Código de Ejemplo:

Select-Xml -Path sample.xml -XPath '/Computers/Computer' | ForEach-Object { $_.Node.name }

Usamos Select-Xml para buscar en el archivo XML ubicado en C:\path\computers-attr.xml nodos que coincidan con la expresión XPath '/Computers/Computer'. Esta expresión XPath selecciona todos los elementos <Computer> bajo el nodo raíz <Computers>.

Luego utilizamos el cmdlet ForEach-Object para iterar sobre los resultados; dentro del bucle, accedemos a la propiedad name de cada nodo coincidente. Esta propiedad representa el valor del atributo name de cada elemento <Computer>.

Salida:

powershell analizar xml - salida 2

Ya sea que estemos leyendo elementos o atributos, la sintaxis de Select-Xml es engorrosa: nos obliga a utilizar el parámetro XPath, luego canalizar el resultado a un bucle y, finalmente, buscar los datos bajo la propiedad Node.

Use la Clase System.Xml.XmlDocument para Analizar Archivos XML Usando PowerShell

La clase System.Xml.XmlDocument para analizar XML en PowerShell ofrece una solución versátil y efectiva para manejar datos XML, convirtiéndola en una herramienta valiosa para diversas tareas de automatización, procesamiento de datos y escenarios de gestión de configuraciones.

Este método implica crear una instancia de la clase XmlDocument, cargar el contenido XML en el objeto del documento y luego navegar a través de los nodos del documento para acceder a los datos deseados.

Código de Ejemplo:

$xmlDocument = New-Object System.Xml.XmlDocument
$xmlDocument.Load("sample.xml")

$computerNodes = $xmlDocument.SelectNodes("//Computer")
foreach ($computerNode in $computerNodes) {
    $name = $computerNode.SelectSingleNode("Name").InnerText
    Write-Output $name
}

En este fragmento de código, creamos una nueva instancia de la clase System.Xml.XmlDocument utilizando New-Object. Luego, cargamos el contenido XML del archivo C:\path\computers.xml en el objeto $xmlDocument utilizando el método Load.

Utilizamos el método SelectNodes para recuperar todos los elementos <Computer> en el documento XML.

Luego, iteramos sobre cada nodo <Computer> usando un bucle foreach. Dentro del bucle, utilizamos SelectSingleNode para encontrar el elemento <Name> dentro de cada nodo <Computer> y extraer su texto interno utilizando la propiedad InnerText.

Finalmente, mostramos los nombres de las computadoras utilizando Write-Output.

Salida:

powershell analiza xml - salida 3

Use la Clase System.Xml.XmlTextReader para Analizar Archivos XML Usando PowerShell

Analizar XML en PowerShell utilizando la clase System.Xml.XmlTextReader ofrece un método sencillo y eficiente en cuanto a memoria para procesar datos XML. Esta clase proporciona un flujo de solo avance y solo lectura que analiza los datos XML de forma eficiente sin cargar todo el documento en la memoria.

Al utilizar el XmlTextReader, los scripts de PowerShell pueden extraer de manera eficiente elementos o atributos específicos de documentos XML, habilitando tareas como extracción de datos, gestión de configuraciones y automatización.

Código de Ejemplo:

$xmlFilePath = "sample.xml"
$xmlReader = [System.Xml.XmlTextReader]::new($xmlFilePath)

while ($xmlReader.Read()) {
    if ($xmlReader.NodeType -eq "Element" -and $xmlReader.Name -eq "Name") {
        $name = $xmlReader.ReadString()
        Write-Output $name
    }
}

En este fragmento de código, especificamos la ruta del archivo XML utilizando la variable $xmlFilePath. Luego, creamos una nueva instancia de la clase System.Xml.XmlTextReader y la inicializamos con el contenido XML del archivo especificado por $xmlFilePath.

Usamos un bucle while para iterar a través del contenido XML utilizando el método Read de la clase XmlTextReader. Dentro del bucle, verificamos si el tipo de nodo actual es un elemento y si su nombre es Name.

Si se cumplen ambas condiciones, usamos el método ReadString para extraer el texto interno del elemento <Name> y lo mostramos utilizando Write-Output.

Salida:

powershell analizar xml - salida 4

Conclusión

Analizar XML en PowerShell es una habilidad versátil y esencial para muchas tareas de automatización y procesamiento de datos. Al entender los diversos métodos disponibles, como Select-Xml, System.Xml.XmlDocument y System.Xml.XmlTextReader, los usuarios de PowerShell pueden extraer y manipular datos de manera eficiente a partir de documentos XML para adaptarlos a sus necesidades.

Ya sea analizando elementos o atributos, cada método ofrece sus ventajas, permitiendo que los scripts de PowerShell manejen datos XML de manera efectiva. Al aprovechar estas técnicas de análisis, los usuarios de PowerShell pueden optimizar sus flujos de trabajo y lograr sus objetivos de automatización de manera más eficiente.

¿Disfrutas de nuestros tutoriales? Suscríbete a DelftStack en YouTube para apoyarnos en la creación de más guías en vídeo de alta calidad. Suscríbete
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

Artículo relacionado - PowerShell XML