Попытка получить элемент XML
Вот фрагмент XML-файла, из которого я хочу извлечь IP-адрес (здесь 172.31.24.8), используя код PowerShell:
<?xml version="1.0"?>
<Configuration xmlns="http://www.tandberg.com/XML/CUIL/2.0" product="Cisco Codec" version="TC7.3.2.14ad7cc" apiVersion="2">
<SIP item="1">
<Profile item="1" maxOccurrence="1">
<Proxy item="1" maxOccurrence="4">
<Address item="1" valueSpaceRef="/Valuespace/STR_0_255_NoFilt">172.31.24.8</Address>
<Discovery item="1" valueSpaceRef="/Valuespace/TTPAR_AutoManual">Manual</Discovery>
</Proxy>
</Profile>
</SIP>
</Configuration>
Я пытался использовать Select-Xml
как описано в других примерах Stackru, но пока безуспешно.
Какой самый простой способ добиться этого правильно?
2 ответа
Я не знаком с Powershell, поэтому не могу помочь вам с кодом Powershell, но я думаю, что Select-Xml работает с выражениями XPath.
Учитывая ваш XML-документ и учитывая, что вы можете каким-то образом зарегистрировать пространство имен по умолчанию, будет работать следующее выражение XPath:
/Configuration/SIP/Profile/Proxy/Address/text()
Если вы не можете зарегистрировать пространство имен по умолчанию, возможно, вы можете зарегистрировать префикс и пространство имен, например
/tb:Configuration/tb:SIP/tb:Profile/tb:Proxy/tb:Address/text()
где tb
должен соответствовать пространству имен http://www.tandberg.com/XML/CUIL/2.0
, Вот ссылка, которая объясняет, как объявлять пространства имен.
Если Select-Xml не может работать с пространствами имен, используйте
/*[local-name() = 'Configuration']/*[local-name() = 'SIP']/*[local-name() = 'Profile']/*[local-name() = 'Proxy']/*[local-name() = 'Address']/text()
и единственный результат всех этих выражений пути будет
172.31.24.8
Я наконец получил это на работу.
Вот пример кода PowerShell, который возвращает желаемый результат.
$Path="Path\to\my\file.xml"
$Namespace = @{tb="http://www.tandberg.com/XML/CUIL/2.0"}
$xml = Select-Xml -Path $Path -Namespace $Namespace -XPath "//tb:Address"
$xml | foreach {$_.node.InnerXML}
Это возвращает значение IP-адреса.
Мой оригинальный код не указывал tb: в XPath, это была моя ошибка.
Спасибо за помощь!
С уважением, Флориан