Условное обновление значений XML - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь условно обновить блок XML в файле. Это целевой блок XML

<Data Description="Runs a keyword test." TestName="MenuAction_DataDriver">
  <Parameters LangId="{897793E3-73F3-4895-A956-3D41D3A24A45}">
    <Parameter Name="FilePath" DefVarType="8" DefValueType="6" DefValueValue="Excel Workbooks\MenuAction.xlsx" VarType="8" ValueType="6" ValueValue="Excel Workbooks\MenuAction.xlsx" />
    <Parameter Name="Sheet" DefVarType="8" DefValueType="6" DefValueValue="Sheet1" VarType="8" ValueType="6" ValueValue="Sheet1" />
    <Parameter Name="Caller" DefVarType="8" DefValueType="6" DefValueValue="" VarType="8" ValueType="6" ValueValue="FileClose" />
  </Parameters>
</Data>

Существует несколько подобных узлов и другие узлы <Data>, которые не имеют этих параметров. Поэтому я пытаюсь перебрать файл, ища <Data> узлы со свойством TestName «MenuAction_DataDriver», а затем специально ищу только те узлы, где Parameter[2].ValueValue - «FileClose». Затем я хочу изменить Parameter[1].ValueValue с «Лист1» на «Файл».

Это моя нынешняя попытка:

$xmlFileName = 'C:\<PathToFileRedacted>.tcKDTest'
[xml]$xmlDoc = Get-Content $xmlFileName
$xmldoc.Root.SelectSingleNode("//Data[@TestName='MenuAction_DataDriver']") |
    ? { $_.Parameters.Parameter.ValueValue[2] -eq 'FileClose'} |
    % {$_.Parameters.Parameter.ValueValue[1] = "File"}
$xmlDoc.Save($xmlFileName)

Куда я иду с этим?

1 Ответ

1 голос
/ 11 марта 2019

Не смешивайте точка доступа и XPath. Вы можете использовать XPath, чтобы выбрать именно тот узел, атрибут которого вы хотите изменить. Вы также, вероятно, не хотите выбирать узлы по индексу, когда вы можете использовать совпадения значений для одного и того же конца.

$xpath = "//Data[@TestName='MenuAction_DataDriver']/Parameters[Parameter[@Name='Caller' and @ValueValue='FileClose']]/Parameter[@Name='Sheet']"

$node = $xmldoc.SelectSingleNode($xpath)
$node.ValueValue = 'File'

Разбивка выражения XPath:

  • //Data[@TestName='MenuAction_DataDriver'] & rarr; выберите <Data> узлов в любом месте XML-документа, которые имеют атрибут TestName со значением MenuAction_DataDriver.
  • /Parameters[Parameter[@Name='Caller' and @ValueValue='FileClose']] & rarr; выберите узел <Parameters> с дочерним узлом <Parameter> с атрибутом Name со значением Caller и атрибутом ValueValue со значением FileClose.
  • /Parameter[@Name='Sheet'] & rarr; выберите узел <Parameter>, который имеет атрибут Name со значением Sheet.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...