Powershell ile o: xml nasıl okunur?

Nov 05 2020

Aşağıdaki xml dosyam var ama Powershell ile nasıl okuyacağımı bilmiyorum, Herkes yardımcı olabilir mi? Teşekkürler!

Powershell'den url değerini almam gerekiyor.

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

Şimdiden teşekkürler!

Yanıtlar

2 mklement0 Nov 05 2020 at 14:56

PowerShell'in XML DOM'un kullanışlı, özellik tabanlı uyarlamasının esasen ad alanlarını yok sayması ve nitelenmemiş öğe adlarıyla ilgilenilen öğeye basitçe inmenize izin vermesi gerçeğinden yararlanabilirsiniz :

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

Buna karşılık, XPath tabanlı Select-Xmlcmdlet , ad alanına duyarlıdır ve bu nedenle local-name(), Mathias R.Jessen'in yanıtında gösterildiği gibi , açık ad alanı işlemeyi veya işlev aracılığıyla bir geçici çözüm gerektirir .

Nihayetinde daha sağlam olan ancak her zaman gerekli olmayan doğru ad alanı işlemeyi kullanmak istiyorsanız, aşağıdakileri kullanın:

(
  Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
  • @{ ... }Önekleri ( o:bu durumda) XPath sorgusunda kullanabilmek için ön koşul olan, kullanılan ad alanı öneklerini ve URL'leri bildiren bir hashtable ( ) geçirme ihtiyacına dikkat edin .

    • Bağımsız -Namespacedeğişkenle tutarlı oldukları ve orijinal URL'lerle eşleştirildikleri sürece önek adlarının orijinaldeki adlarla eşleşmesi gerekmez .
  • Select-Xmleşleşen örneklerin etrafına sarıcı nesneleri döndürür System.Xml.XmlNode, bu nedenle .Nodeikincisine erişmek için gereklidir ve .InnerTextardından düğümün metin içeriğini döndürür.

    • Bir kenara olarak: .NodeTipik kullanım örneği, tek olanla ilgilenmek olduğu için, bu erişim ihtiyacı zahmetlidir XmlNode; GitHub önerisi # 13669
      -Raw , XmlNodeörnekleri doğrudan döndüren bir anahtar aracılığıyla acıyı hafifletmeyi amaçlamaktadır .
1 MathiasR.Jessen Nov 05 2020 at 14:43

Şunları kullanabilirsiniz 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 şimdi dizeyi içerecek "https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider"

1 AdminOfThings Nov 05 2020 at 15:00

Json döndürdüğünüz için, json'dan bir PowerShell nesnesine dönüştürebilirsiniz:

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