¿Cómo leer o: xml con powershell?

Nov 05 2020

Tengo el siguiente archivo xml pero no sé cómo leerlo con Powershell, ¿alguien puede ayudarme? ¡Gracias!

Necesito obtener el valor de la URL de Powershell.

<o:OfficeConfig xmlns:o="urn:xxx:xxx:xxx">
<o:services>
<o:service o:name="xxxx">
<o:url>https://xxx.xxx</o:url>
</o:service>
</o:services>
</o:OfficeConfig>

¡Gracias por adelantado!

Respuestas

2 mklement0 Nov 05 2020 at 14:56

Puede aprovechar el hecho de que la adaptación conveniente y basada en propiedades de PowerShell del XML DOM esencialmente ignora los espacios de nombres, lo que le permite simplemente profundizar en el elemento de interés por los nombres de elementos no calificados:

([xml] (Get-Content -Raw file.xml)).OfficeConfig.services.service.url

Por el contrario, el Select-Xmlcmdlet basado en XPath tiene en cuenta el espacio de nombres y, por lo tanto, requiere un manejo explícito del espacio de nombres, o una solución alternativa a través de la local-name()función, como se muestra en la respuesta de Mathias R. Jessen .

Si desea utilizar el manejo adecuado del espacio de nombres, que en última instancia es más sólido, pero no siempre necesario, utilice lo siguiente:

(
  Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
  • Tenga en cuenta la necesidad de pasar una tabla hash ( @{ ... }) que declare los prefijos del espacio de nombres y las URL utilizadas, que es el requisito previo para poder utilizar los prefijos ( o:, en este caso) en la consulta XPath.

    • Los nombres de los prefijos no tienen por qué coincidir con los del original, siempre que sean coherentes con el -Namespaceargumento y estén asignados a las URL originales.
  • Select-Xmldevuelve objetos de envoltura alrededor de las System.Xml.XmlNodeinstancias coincidentes , por lo que .Nodese requiere acceder a estas últimas, y .InnerTextluego devuelve el contenido de texto del nodo.

    • Como nota al margen: esta necesidad de acceso .Nodees inconveniente, ya que el caso de uso típico es preocuparse por el XmlNodeúnico; La sugerencia de GitHub # 13669 busca aliviar el dolor mediante un
      -Rawinterruptor que devuelve las XmlNodeinstancias directamente.
1 MathiasR.Jessen Nov 05 2020 at 14:43

Podrías usar Select-Xml:

$rawXml = @' <o:OfficeConfig xmlns:o="urn:schemas-microsoft-com:office:office"> <o:services> <o:service o:name="GetFederationProvider"> <o:url>https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider</o:url> </o:service> </o:services> </o:OfficeConfig> '@ $urlNode = $rawXml |Select-Xml -XPath '//*[local-name() = "url"]' |Select -Expand Node $url = $urlNode.innerText

$url ahora contendrá la cadena "https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider"

1 AdminOfThings Nov 05 2020 at 15:00

Como está devolviendo json, puede convertir de json a un objeto de PowerShell:

$configServiceUrl = "https://officeclient.microsoft.com/config16processed?rs=en-us&build=16.0.7612" $headers = @{'Accept' = 'application/json'}
$getFederationProviderEndpoint = Invoke-WebRequest -Uri "$($configServiceUrl)&services=GetFederationProvider" -Headers $headers -Method GET

$obj = $getFederationProviderEndpoint.Content | ConvertFrom-Json
$obj.'o:officeconfig'.'o:services'.'o:service'.'o:url'