Попытка получить элемент 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, это была моя ошибка.

Спасибо за помощь!

С уважением, Флориан

Другие вопросы по тегам