Bagaimana cara membaca o: xml dengan PowerShell?
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
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.
- Nama awalan tidak harus sama dengan nama aslinya, selama konsisten dengan
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 peduliXmlNode; Saran GitHub # 13669 berusaha meredakan rasa sakit melalui
-Rawsakelar yang mengembalikanXmlNodeinstance secara langsung.
- Sebagai tambahan: Kebutuhan untuk mengakses
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"
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'