выбор конкретного узла с помощью xpath в powershell - PullRequest
1 голос
/ 15 мая 2019

Я пытаюсь выбрать конкретный узел в файле XML для сравнения его с тем же узлом в другом файле.

Я могу перемещаться по файлу, используя общие узлы, но не могу понять, как получить точный Xpath.

Вот XML:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Domain wide values -->
  <PropertyGroup>
    <LoggingLevel>0</LoggingLevel>
    <LongTimeouts>0</LongTimeouts>
  </PropertyGroup>
  <ItemGroup>
    <!--AB-->
    <Token Include="{AB_ANALYTICSSERVER}">
      <Value>Test</Value>
    </Token>
    <Token Include="{AB_CERTFINDVALUE}">
      <Value>$(CertName)</Value>
    </Token>
    <Token Include="{AB_SERVICECERTFINDVALUE}">
      <Value>$(CertName)</Value>
    </Token>
    <Token Include="{AB_CONSUMERSGROUP}">
      <Value>DLG-AB-users</Value>
    </Token>
    <!--AB End-->
    <!--Database-->
    <Token Include="{Database_Domain}">
      <Value>$(Domain)</Value>
    </Token>
    <Token Include="{Audit_Domain}">
      <Value>$(Domain)</Value>
    </Token>
    <!--Database End-->
  </ItemGroup>
</Project>

Но я явно что-то упускаю в моих запросах на основе xpath:

например. $xmlNew.SelectNodes("/node()[1]/node()[3]/node()[2]").outerxml

Возвращает:

<Token Include="{AB_ANALYTICSSERVER}" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><Value>Test</Value></Token>

Но ни один из них ничего не возвращает:

$xmlNew.SelectNodes("/Project/ItemGroup/Token").outerxml

$xmlnew.selectnodes('//token[contains(@Include,"{AB_ANALYTICSSERVER}")]').OuterXml

Аналогично это работает:

$xmlNew.SelectNodes("/node()[1]/node()[2]/node()[2]").outerxml

но это не так:

$xmlnew.selectnodes('/Project/PropertyGroup/LongTimeouts').outerxml нет.

Какую очевидную вещь мне не хватает? : /

Спасибо

1 Ответ

2 голосов
/ 15 мая 2019

Проблема в том, что ваш XPath недействителен из-за пространства имен.

Однако вы можете злоупотреблять мощью PowerShell и просто получить доступ к Token, как если бы это была структура объекта.

$xmlNew.Project.ItemGroup.Token.outerxml

Вы также можете использовать командлет Select-Xml и явно указать пространство имен вместе с XPath, как показано в в этом ответе .

$ns = @{dns = 'http://schemas.microsoft.com/developer/msbuild/2003'}
Select-Xml -Xml $xmlNew -XPath '//dns:Token' -Namespace $ns
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...