попытка выбрать один узел из XML-файла не удалась

В сценарии PowerShell я пытаюсь выбрать второе MemberShipRule (для UnixComponentGroup) из этого XML-файла:

<Discoveries>
  <Discovery ID="Service_ARCHIBUS_SCPopulation" Enabled="true" Target="Service_ARCHIBUS" ConfirmDelivery="false" Remotable="true" Priority="Normal">
    <Category>Discovery</Category>
    <DiscoveryTypes />
    <DataSource ID="DS" TypeID="SystemCenter!Microsoft.SystemCenter.GroupPopulator">
      <RuleId>$MPElement$</RuleId>
      <GroupInstanceId>$Target/Id$</GroupInstanceId>
      <MembershipRules>
        <MembershipRule>
          <MonitoringClass>$MPElement[Name="WindowsComponentGroup_Service_ARCHIBUS"]$</MonitoringClass>
          <RelationshipClass>$MPElement[Name="ATS.Application.ARCHIBUS.WindowsServiceHealthRollup"]$</RelationshipClass>
        </MembershipRule>
        <MembershipRule>
          <MonitoringClass>$MPElement[Name="UnixComponentGroup_Service_ARCHIBUS"]$</MonitoringClass>
          <RelationshipClass>$MPElement[Name="ATS.Application.ARCHIBUS.UnixServiceHealthRollup"]$</RelationshipClass>
        </MembershipRule>
      </MembershipRules>
    </DataSource>
  </Discovery>
 </Discoveries>

Строка "ARCHIBUS" хранится в переменной $appnorm. Я пробовал разные версии, моя последняя была:

$xml = Get-Content $apppath
$appnorm = "ARCHIBUS"
$node = $xml.SelectSingleNode('//MembershipRule/MonitoringClass[.=$MPElement[Name="UnixComponentGroup_Service_' + $appnorm + '"]$]')

Результатом всегда является значение null. Было бы здорово, если бы кто-нибудь мог мне помочь.

Благодарю вас!

С уважением

Ульф


person Ulf Albrecht    schedule 02.03.2018    source источник


Ответы (1)


Это потому, что ваш объект $xml является строкой. Из-за этого у него нет этого метода (вы можете передать любой объект в Get-Member, чтобы увидеть его тип и методы). Поэтому вам нужно сначала преобразовать его в xml, затем вы можете вызвать для него SelectSingleNode, но я бы искал ваши элементы, используя упрощенный синтаксис PowerShell:

[xml]$xml = Get-Content $apppath
$appnorm = "ARCHIBUS"
$xml.Discoveries.Discovery.DataSource.MembershipRules.MembershipRule | Where-Object { $_.MonitoringClass -eq "`$MPElement[Name=`"WindowsComponentGroup_Service_$appnorm`"]`$" }
person bergmeister    schedule 02.03.2018