วิธีอ่าน o: xml ด้วย powershell
ฉันมีไฟล์ xml ต่อไปนี้ แต่ไม่รู้วิธีอ่านด้วย Powershell ใครก็ได้ช่วยด้วย? ขอบคุณ!
ฉันต้องการรับค่า url จาก 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>
ขอบคุณล่วงหน้า!
คำตอบ
คุณสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่าการปรับใช้ XML DOMตามคุณสมบัติที่สะดวกและสะดวกของ PowerShell นั้นจะไม่สนใจเนมสเปซเป็นหลักทำให้คุณสามารถเจาะลึกไปยังองค์ประกอบที่น่าสนใจโดยใช้ชื่อองค์ประกอบที่ไม่มีเงื่อนไข
([xml] (Get-Content -Raw file.xml)).OfficeConfig.services.service.url
โดยคมชัด XPath ตามSelect-Xmlcmdlet เป็น namespace ทราบและดังนั้นจึงต้องจัดการ namespace อย่างชัดเจน - หรือวิธีแก้ปัญหาที่ผ่านมาทั้งlocal-name()ฟังก์ชั่นดังแสดงในคำตอบงัดอาร์เซ่นของ
หากคุณต้องการใช้การจัดการเนมสเปซที่เหมาะสมซึ่งท้ายที่สุดแล้วจะมีประสิทธิภาพมากกว่า แต่ก็ไม่จำเป็นเสมอไปให้ใช้สิ่งต่อไปนี้:
(
Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
โปรดสังเกตว่าจำเป็นต้องส่งแฮชแท็ก (
@{ ... }) ที่ประกาศคำนำหน้าเนมสเปซและ URL ที่ใช้ซึ่งเป็นข้อกำหนดเบื้องต้นสำหรับความสามารถในการใช้คำนำหน้า (o:ในกรณีนี้) ในแบบสอบถาม XPath- ชื่อคำนำหน้าไม่จำเป็นต้องตรงกับชื่อในต้นฉบับตราบใดที่มันสอดคล้องกับ
-Namespaceอาร์กิวเมนต์และแมปกับ URL ดั้งเดิม
- ชื่อคำนำหน้าไม่จำเป็นต้องตรงกับชื่อในต้นฉบับตราบใดที่มันสอดคล้องกับ
Select-Xmlส่งคืนอ็อบเจ็กต์wrapperรอบ ๆSystem.Xml.XmlNodeอินสแตนซ์ที่ตรงกันดังนั้นจึง.Nodeจำเป็นในการเข้าถึงส่วนหลังจาก.InnerTextนั้นส่งคืนเนื้อหาข้อความของโหนด- นอกจากนี้: ความจำเป็นในการเข้าถึง
.Nodeนี้ไม่สะดวกเนื่องจากกรณีการใช้งานทั่วไปคือการดูแลXmlNodeเฉพาะ คำแนะนำของ GitHub # 13669พยายามบรรเทาความเจ็บปวดผ่าน
-Rawสวิตช์ที่เรียกคืนXmlNodeอินสแตนซ์โดยตรง
- นอกจากนี้: ความจำเป็นในการเข้าถึง
คุณสามารถใช้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 ตอนนี้จะมีสตริง "https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider"
เนื่องจากคุณกำลังส่งคืน json คุณสามารถแปลงจาก json เป็นวัตถุ 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'