Wie lese ich o: xml mit Powershell?

Nov 05 2020

Ich habe folgende XML-Datei, weiß aber nicht, wie ich sie mit Powershell lesen soll. Kann mir jemand helfen? Vielen Dank!

Ich muss den URL-Wert von Powershell erhalten.

<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>

Danke im Voraus!

Antworten

2 mklement0 Nov 05 2020 at 14:56

Sie können die Tatsache nutzen, dass die bequeme, eigenschaftsbasierte Anpassung des XML-DOM durch PowerShell Namespaces im Wesentlichen ignoriert , sodass Sie einfach anhand der nicht qualifizierten Elementnamen einen Drilldown zum gewünschten Element durchführen können:

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

Im Gegensatz dazu die XPath-basierten Select-XmlCmdlets sind Namespace-aware, und deshalb erfordern expliziten Namespace Handling - oder eine Abhilfe über die local-name()Funktion, wie in gezeigt Mathias R. Jessen Antwort .

Wenn Sie eine ordnungsgemäße Behandlung von Namespaces verwenden möchten, die letztendlich robuster, aber nicht immer erforderlich ist, verwenden Sie Folgendes:

(
  Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
  • Beachten Sie, dass eine Hashtabelle ( @{ ... }) übergeben werden muss, die die verwendeten Namespace-Präfixe und URLs deklariert. o:Dies ist die Voraussetzung, um die Präfixe ( in diesem Fall) in der XPath-Abfrage verwenden zu können.

    • Die Präfixnamen müssen nicht mit denen im Original übereinstimmen, solange sie mit dem -NamespaceArgument übereinstimmen und den ursprünglichen URLs zugeordnet sind.
  • Select-XmlGibt Wrapper- Objekte um die übereinstimmenden System.Xml.XmlNodeInstanzen zurück, .Nodeist also erforderlich, um auf letztere zuzugreifen, und gibt .InnerTextdann den Textinhalt des Knotens zurück.

    • Nebenbei bemerkt: Diese Notwendigkeit des Zugriffs .Nodeist unpraktisch, da der typische Anwendungsfall darin besteht, sich nur um das zu kümmern XmlNode; Der GitHub-Vorschlag Nr. 13669 versucht, die Schmerzen über einen
      -RawSchalter zu lindern, der die XmlNodeInstanzen direkt zurücksetzt .
1 MathiasR.Jessen Nov 05 2020 at 14:43

Sie könnten verwenden 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 wird nun die Zeichenfolge enthalten "https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider"

1 AdminOfThings Nov 05 2020 at 15:00

Da Sie json zurückgeben, können Sie einfach von json in ein PowerShell-Objekt konvertieren:

$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'