如何使用powershell读取o:xml?
我有以下xml文件,但不知道如何使用Powershell读取它,有人可以帮助吗?谢谢 我需要从Powershell获取url值如何使用powershell读取o:xml?,xml,powershell,openxml,Xml,Powershell,Openxml,我有以下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: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>
https://xxx.xxx
提前谢谢 您可以使用
选择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
$rawXml=@'
https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider
'@
$urlNode=$rawXml |选择Xml-XPath'/*[local-name()=“url”]|选择-展开节点
$url=$urlNode.innerText
$url
现在将包含字符串”https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider“
您可以使用选择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
$rawXml=@'
https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider
'@
$urlNode=$rawXml |选择Xml-XPath'/*[local-name()=“url”]|选择-展开节点
$url=$urlNode.innerText
$url
现在将包含字符串”https://odc.officeapps.live.com/odc/emailhrd/getfederationprovider“
您可以利用这样一个事实,即PowerShell方便、基于属性的特性基本上忽略了名称空间,允许您通过非限定元素名称深入到感兴趣的元素:
([xml] (Get-Content -Raw file.xml)).OfficeConfig.services.service.url
相比之下,基于XPath的cmdlet具有名称空间意识,因此需要显式的名称空间处理,或者通过
local-name()
函数进行变通,如中所示
如果您希望使用适当的命名空间处理(这最终会更加健壮,但并非总是必要的),请使用以下方法:
(
Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
- 请注意,需要传递一个哈希表(
),该哈希表声明所使用的名称空间前缀和URL,这是能够在XPath查询中使用前缀(@{…}
)的先决条件o:
- 前缀名称不需要与原始URL中的名称匹配,只要它们与
参数一致,并且映射到原始URL-Namespace
- 前缀名称不需要与原始URL中的名称匹配,只要它们与
返回匹配实例周围的包装对象,因此需要Select Xml
访问后者,然后.Node
返回节点的文本内容.InnerText
- 顺便说一句:这需要访问
是不方便的,因为典型的用例是只关心.Node
;通过XmlNode
来缓解疼痛
开关,可直接返回-Raw
实例XmlNode
- 顺便说一句:这需要访问
([xml] (Get-Content -Raw file.xml)).OfficeConfig.services.service.url
相比之下,基于XPath的cmdlet具有名称空间意识,因此需要显式的名称空间处理,或者通过
local-name()
函数进行变通,如中所示
如果您希望使用适当的命名空间处理(这最终会更加健壮,但并非总是必要的),请使用以下方法:
(
Select-Xml '//o:url' file.xml -Namespace @{ o='urn:schemas-microsoft-com:office:office' }
).Node.InnerText
- 请注意,需要传递一个哈希表(
),该哈希表声明所使用的名称空间前缀和URL,这是能够在XPath查询中使用前缀(@{…}
)的先决条件o:
- 前缀名称不需要与原始URL中的名称匹配,只要它们与
参数一致,并且映射到原始URL-Namespace
- 前缀名称不需要与原始URL中的名称匹配,只要它们与
返回匹配实例周围的包装对象,因此需要Select Xml
访问后者,然后.Node
返回节点的文本内容.InnerText
- 顺便说一句:这需要访问
是不方便的,因为典型的用例是只关心.Node
;通过XmlNode
来缓解疼痛
开关,可直接返回-Raw
实例XmlNode
- 顺便说一句:这需要访问
$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'
由于您返回的是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'
嘿@Mathias R.Jessen,谢谢你的快速回答。然而,
selectxml
在我这方面似乎不起作用。我仍然无法通过这种方式获得值。有什么我遗漏的吗?@WayneYang删除converttoxml
call谢谢,我试图删除converttoxml
,但出现了以下错误:Select Xml:Cannot convert value“{”o:OfficeConfig:{“@xmlns:o:”urn:schemas microsoft com:office:office”,“o:services:{”o:service:{“@o:name:”GetFederationProvider”,“o:url:“}}}}}}“System.Xml.XmlDocument”.Error:“指定的节点不能作为此节点的有效子节点插入,因为指定的节点类型错误。”。“@WayneYang这是JSON,不是XML。请用你的实际行动更新你的原始帖子嘿@Mathias R.Jessen,谢谢你的快速回答。然而,selectxml
在我这方面似乎不起作用。我仍然无法通过这种方式获得值。有什么我遗漏的吗?@WayneYang删除converttoxml
call谢谢,我试图删除converttoxml
,但出现了以下错误:Select Xml:Cannot convert value“{”o:OfficeConfig:{“@xmlns:o:”urn:schemas microsoft com:office:office”,“o:services:{”o:service:{“@o:name:”GetFederationProvider”,“o:url:“}}}}}}“System.Xml.XmlDocument”.Error:“指定的节点不能作为此节点的有效子节点插入,因为指定的节点类型错误。”。“@WayneYang这是JSON,不是XML。请用您实际所做的更新您的原始帖子看起来我们有一个问题:您通过一个文件询问XML,认为您需要首先将web服务的响应转换为XML。但是,它看起来像是JSON,您应该对其进行类似的处理,并且调用RestMethod
将直接转换为对象图(其中@Admi