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