我正在尝试有条件地更新文件中的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)
我在哪里错了?
答案 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>
。