如何用powershell读取o:xml?
How to read o:xml with powershell?
我有以下 xml 文件,但不知道如何使用 Powershell 读取它,有人可以帮忙吗?谢谢!
我需要从 Powershell 获取 url 值。
<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>
提前致谢!
您可以使用 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"
您可以利用 PowerShell 的便利性,property-based 本质上 忽略 命名空间,让您可以简单地深入到元素非限定元素名称的兴趣:
([xml] (Get-Content -Raw file.xml)).OfficeConfig.services.service.url
相比之下,XPath-based Select-Xml
cmdlet is namespace-aware, and therefore requires explicit namespace handling - or a workaround via the local-name()
function, as shown in .
如果你想使用正确的命名空间处理——这最终更健壮,但并非总是必要——使用以下方法:
(
Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
注意需要传递一个散列表(@{ ... }
)来声明所使用的命名空间前缀和 URL,这是能够使用前缀(o:
,在本例中)在 XPath 查询中。
- 前缀名称无需与原始名称匹配,只要它们与
-Namespace
参数一致并映射到原始 URL。
Select-Xml
returns wrapper 匹配的 System.Xml.XmlNode
实例周围的对象,因此需要 .Node
访问后者,然后 .InnerText
然后 returns 节点的文本内容。
- 顺便说一句:这需要访问
.Node
是不方便的,因为典型的用例是只关心 XmlNode
; GitHub suggestion #13669 试图通过
来缓解疼痛
-Raw
直接返回 XmlNode
个实例的开关。
由于您要返回 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'
我有以下 xml 文件,但不知道如何使用 Powershell 读取它,有人可以帮忙吗?谢谢!
我需要从 Powershell 获取 url 值。
<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>
提前致谢!
您可以使用 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"
您可以利用 PowerShell 的便利性,property-based
([xml] (Get-Content -Raw file.xml)).OfficeConfig.services.service.url
相比之下,XPath-based Select-Xml
cmdlet is namespace-aware, and therefore requires explicit namespace handling - or a workaround via the local-name()
function, as shown in
如果你想使用正确的命名空间处理——这最终更健壮,但并非总是必要——使用以下方法:
(
Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
注意需要传递一个散列表(
@{ ... }
)来声明所使用的命名空间前缀和 URL,这是能够使用前缀(o:
,在本例中)在 XPath 查询中。- 前缀名称无需与原始名称匹配,只要它们与
-Namespace
参数一致并映射到原始 URL。
- 前缀名称无需与原始名称匹配,只要它们与
Select-Xml
returns wrapper 匹配的System.Xml.XmlNode
实例周围的对象,因此需要.Node
访问后者,然后.InnerText
然后 returns 节点的文本内容。- 顺便说一句:这需要访问
.Node
是不方便的,因为典型的用例是只关心XmlNode
; GitHub suggestion #13669 试图通过
来缓解疼痛-Raw
直接返回XmlNode
个实例的开关。
- 顺便说一句:这需要访问
由于您要返回 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'