我有以下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元素的语法。
答案 0 :(得分:2)
在PowerShell中,您可以访问属性等XML节点,因此可以:
($xml.DocumentElement.setting | ? name -eq 'KMSettings').value.KMIndexSettings.AutoIndexEnabled
这是一个有效的XPATH解决方案:
[string]$xpath="//userSettings/setting[@name='KMSettings']/value/KMIndexSettings/AutoIndexEnabled"
$xml.SelectSingleNode($xpath)
答案 1 :(得分:2)
我不明白这个问题。这里的命名空间无关紧要,因为您的xml-sample不包含前缀元素或默认命名空间。您可以像这样访问元素:
$xml.SelectNodes("//AutoIndexEnabled")
或
$xml.SelectNodes("//setting[@name='KMSettings']//AutoIndexEnabled")
输出:
#text
-----
false
PS> $xml.SelectNodes("//AutoIndexEnabled").InnerText
false
答案 2 :(得分:0)
在这个特定示例中,您将如何选择名称为“ 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”
这是我正在尝试的。冒号正在删除我的脚本。我收到以下错误:“表达式或语句中出现意外的标记':id'。”
([xml](gc $files[$i])).contentHaul.constant.typedValue.value.a:id