有条件地更新XML值

时间:2019-03-11 14:36:27

标签: xml powershell

我正在尝试有条件地更新文件中的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>属性为“ MenuAction_DataDriver”的TestName个节点,然后专门查找Parameter[2].ValueValue为“ FileClose”的节点”。然后,我希望将Parameter[1].ValueValue从“ Sheet1”更改为“ File”。

这是我目前所做的尝试:

$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 个答案:

答案 0 :(得分:1)

不要混用点访问和XPath。您可以使用XPath精确选择要修改其属性的节点。当可以在同一端使用值匹配时,您可能也不想按索引选择节点。

SUB = induced_subgraph(g, subcomponent(g, "Bob", mode="out"))
TopLevel = farthest.nodes(SUB)$vertices[2]
TopLevel
+ 1/4 vertex, named:
[1] David

XPath表达式的分解:

  • $xpath = "//Data[@TestName='MenuAction_DataDriver']/Parameters[Parameter[@Name='Caller' and @ValueValue='FileClose']]/Parameter[@Name='Sheet']" $node = $xmldoc.SelectSingleNode($xpath) $node.ValueValue = 'File' →在XML文档中的任意位置选择//Data[@TestName='MenuAction_DataDriver']个具有属性<Data>且值为TestName的节点。
  • MenuAction_DataDriver→选择一个/Parameters[Parameter[@Name='Caller' and @ValueValue='FileClose']]节点,该节点的子节点<Parameters>的属性为<Parameter>,值为Name,属性为{{1} },其值为Caller
  • ValueValue→选择一个节点FileClose,它的属性/Parameter[@Name='Sheet']的值为<Parameter>