Làm thế nào để đọc o: xml với powershell?
Tôi có tệp xml sau đây nhưng không biết làm thế nào để đọc nó với Powershell, Bất cứ ai có thể giúp với? Cảm ơn!
Tôi cần lấy giá trị url từ 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>
Cảm ơn trước!
Trả lời
Bạn có thể tận dụng thực tế là sự thích ứng dựa trên thuộc tính, thuận tiện của PowerShell với XML DOM về cơ bản bỏ qua không gian tên, cho phép bạn chỉ cần đi sâu vào phần tử quan tâm bằng các tên phần tử không đủ tiêu chuẩn:
([xml] (Get-Content -Raw file.xml)).OfficeConfig.services.service.url
Ngược lại, XPath dựa trên Select-Xmllệnh là namespace-aware, và do đó đòi hỏi phải xử lý không gian tên rõ ràng - hoặc một workaround thông qua local-name()chức năng, như trong câu trả lời Mathias R. Jessen của .
Nếu bạn muốn sử dụng xử lý không gian tên thích hợp - điều này cuối cùng mạnh mẽ hơn, nhưng không phải lúc nào cũng cần thiết - hãy sử dụng cách sau:
(
Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
Lưu ý rằng cần phải chuyển một hashtable (
@{ ... }) khai báo các tiền tố không gian tên và URL được sử dụng, đây là điều kiện tiên quyết để có thể sử dụng các tiền tố (o:trong trường hợp này) trong truy vấn XPath.- Tên tiền tố không cần khớp với tên trong bản gốc, miễn là chúng nhất quán với
-Namespaceđối số và được ánh xạ tới các URL gốc.
- Tên tiền tố không cần khớp với tên trong bản gốc, miễn là chúng nhất quán với
Select-Xmltrả về các đối tượng trình bao bọc xung quanh các System.Xml.XmlNodecá thể đã khớp , vì vậy.Nodecần phải truy cập vào các đối tượng sau đó,.InnerTextrồi trả về nội dung văn bản của nút.- Như một bên: Nhu cầu truy cập
.Nodenày là bất tiện, vì trường hợp sử dụng điển hình là quan tâm đếnXmlNodeduy nhất; GitHub đề xuất # 13669 tìm cách giảm bớt cơn đau thông qua một
-Rawnút chuyểnXmlNodetrực tiếp lặp lại các trường hợp.
- Như một bên: Nhu cầu truy cập
Bạn có thể sử dụng 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 bây giờ sẽ chứa chuỗi "https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider"
Vì bạn đang trả về json, bạn chỉ có thể chuyển đổi từ json thành một đối tượng 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'