Select XML 个来自使用 Powershell 的命名空间的节点

Select XML nodes from a namespace using Powershell

我有以下 xml:

<?xml version="1.0" encoding="utf-8"?>
<userSettings>
  <setting name="TelephonyServerHost">
    <value>sipserver.domain.local</value>
  </setting>
  <setting name="SipServerFqdn">
    <value>sipserver.domain.local</value>
  </setting>
  <setting name="WebServicesHost">
    <value>websvc.domain.local</value>
  </setting>
  <setting name="KMSettings">
    <value>
      <KMIndexSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <AutoIndexEnabled>false</AutoIndexEnabled>
     </KMIndexSettings>
    </value>
  </setting>
</userSettings>

我能够使用 xpath 检索设置元素的值,但我无法找出使用命名空间查询 AutoIndexEnabled 元素的正确语法。

对于读取 KMSettings 或其他没有命名空间的节点,这按预期工作:

$xml = New-Object -TypeName 'System.XML.XMLDocument'
$xml.Load($xmlFilePath)
$node = $xml.SelectSingleNode("//userSettings/setting[@name='KMSettings']")

但我无法弄清楚如何查询 AutoIndexEnabled 元素的语法。

在 PowerShell 中,您可以像访问属性一样访问 XML 节点,所以这有效:

($xml.DocumentElement.setting | ? name -eq 'KMSettings').value.KMIndexSettings.AutoIndexEnabled

这是一个有效的 XPATH 解决方案:

[string]$xpath="//userSettings/setting[@name='KMSettings']/value/KMIndexSettings/AutoIndexEnabled"       
$xml.SelectSingleNode($xpath)

我不明白这个问题。命名空间在这里无关紧要,因为您的 xml-sample 不包含前缀元素或默认命名空间。您可以像这样访问元素:

$xml.SelectNodes("//AutoIndexEnabled")

$xml.SelectNodes("//setting[@name='KMSettings']//AutoIndexEnabled")

输出:

#text
-----
false

PS> $xml.SelectNodes("//AutoIndexEnabled").InnerText
false

在这个特定的示例中,您如何 select 名称为 "xmlns:xsi" 的属性的值?

<value>
  <KMIndexSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ... >
    <AutoIndexEnabled>false</AutoIndexEnabled>
 </KMIndexSettings>
</value>

我希望看到输出:“http://www.w3.org/2001/XMLSchema-instance

这就是我的意思 trying.The 冒号与我的脚本不符。我收到以下错误:"Unexpected token ':id' in expression or statement."

([xml](gc $files[$i])).contentHaul.constant.typedValue.value.a:id