Muy bien, otra lección rápida en la búsqueda de XML.
Ves, un nodo XML como este:
<server name="DomainController1"></server>
Usa el nombre como un atributo. Acabo de escribir un post sobre cómo buscar en XML por atributo de nodo.
Pero eso no te servirá de nada contra el valor del texto real del nodo.
<server>DomainController1</server>
Totalmente diferente. El truco aquí es usar el método «text()».
$XML | Select-Xml -Xpath '//server'
Oh sí… Eso es lo bueno.
También puedes buscar unos niveles más abajo. Aquí hay un ejemplo de un archivo de Remote Desktop Connection Manager.
<group> <properties> <expanded>True</expanded> <name>DomainControllers</name> </properties> <logonCredentials inherit="None"> <profileName scope="File">myDomain\myAccount</profileName> </logonCredentials> <server> <properties> <name>DomainController1.myDomain.demo</name> </properties> </server></group>
Si quiero obtener el nodo GROUP que tiene el SERVER llamado DomainController1.myDomain.demo en él… puedo hacerlo con XPath y Select-XML.
#This isn't exactly it, but it's a learning step to help you better understand.$xml | Select-XML -XPath '//group/server/properties/name'
Así es como se obtiene el nodo nombre del servidor que está en el grupo. ¿Ves lo cerca que está? ¿No estás aprendiendo ya?
En inglés, esa sentencia XPath se traduce como «Dame el nodo NAME que tiene el valor de texto de DomainController1.MyDomain.demo, que es el nodo hijo de un nodo llamado properties, que es hijo de uno llamado server, que es hijo de un nodo llamado group. Y, ese nodo group puede estar en cualquier parte del XML»
Definimos fuera de los paréntesis el nodo que queremos recibir. Definimos dentro de los paréntesis las evaluaciones para llegar allí.
Como quiero el nodo GROUP, voy a meter todo lo demás dentro de los paréntesis.
$xml | Select-XML -XPath '//group'
Ahora eso devuelve el nodo group. Estás listo para clonar el nodo, actualizar los atributos o insertar un nodo hijo y luego guardar el objeto XML actualizado de nuevo en el archivo XML original.