如何使用powershell读取o:xml?

如何使用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> <

我有以下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>

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中的名称匹配,只要它们与
      -Namespace
      参数一致,并且映射到原始URL
  • Select Xml
    返回匹配实例周围的包装对象,因此需要
    .Node
    访问后者,然后
    .InnerText
    返回节点的文本内容

    • 顺便说一句:这需要访问
      .Node
      是不方便的,因为典型的用例是只关心
      XmlNode
      ;通过
      来缓解疼痛
      -Raw
      开关,可直接返回
      XmlNode
      实例

您可以利用这样一个事实,即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中的名称匹配,只要它们与
      -Namespace
      参数一致,并且映射到原始URL
  • Select Xml
    返回匹配实例周围的包装对象,因此需要
    .Node
    访问后者,然后
    .InnerText
    返回节点的文本内容

    • 顺便说一句:这需要访问
      .Node
      是不方便的,因为典型的用例是只关心
      XmlNode
      ;通过
      来缓解疼痛
      -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'

由于您返回的是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