Bagaimana cara membaca o: xml dengan PowerShell?

Nov 05 2020

Saya telah mengikuti file xml tetapi tidak tahu cara membacanya dengan Powershell, Ada yang bisa membantu? Terima kasih!

Saya perlu mendapatkan nilai url dari 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>

Terima kasih sebelumnya!

Jawaban

2 mklement0 Nov 05 2020 at 14:56

Anda dapat memanfaatkan fakta bahwa adaptasi XML DOM yang nyaman dan berbasis properti dari PowerShell pada dasarnya mengabaikan ruang nama, memungkinkan Anda menelusuri elemen yang diminati dengan nama elemen yang tidak memenuhi syarat:

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

Sebaliknya, berbasis XPath Select-Xmlcmdlet adalah namespace-aware, dan karena itu memerlukan eksplisit namespace penanganan - atau solusi melalui local-name()fungsi, seperti yang ditunjukkan pada jawaban Mathias R. Jessen ini .

Jika Anda ingin menggunakan penanganan namespace yang tepat - yang pada akhirnya lebih kuat, tetapi tidak selalu diperlukan - gunakan yang berikut ini:

(
  Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
  • Perhatikan kebutuhan untuk meneruskan hashtable ( @{ ... }) yang mendeklarasikan prefiks namespace dan URL yang digunakan, yang merupakan prasyarat untuk dapat menggunakan prefiks ( o:, dalam hal ini) dalam kueri XPath.

    • Nama awalan tidak harus sama dengan nama aslinya, selama konsisten dengan -Namespaceargumen dan dipetakan ke URL asli.
  • Select-Xmlmengembalikan objek pembungkus di sekitar System.Xml.XmlNodecontoh yang cocok , jadi .Nodediperlukan untuk mengakses yang terakhir, dan .InnerTextkemudian mengembalikan konten teks node.

    • Sebagai tambahan: Kebutuhan untuk mengakses .Nodeini tidak nyaman, karena kasus penggunaan tipikal adalah hanya peduli XmlNode; Saran GitHub # 13669 berusaha meredakan rasa sakit melalui
      -Rawsakelar yang mengembalikan XmlNodeinstance secara langsung.
1 MathiasR.Jessen Nov 05 2020 at 14:43

Anda bisa menggunakan 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 sekarang akan berisi string "https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider"

1 AdminOfThings Nov 05 2020 at 15:00

Karena Anda mengembalikan json, Anda bisa mengonversi dari json ke objek 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'