如果其他Node.InnerText与哈希表键匹配,则将XML节点的InnerText设置为哈希表值
如标题所述,如果hashtable键与另一个XML节点的InnerText匹配,我想将新ChildNode的InnerText设置为等于hashtable值 XML示例:如果其他Node.InnerText与哈希表键匹配,则将XML节点的InnerText设置为哈希表值,xml,powershell,selectsinglenode,selectnodes,Xml,Powershell,Selectsinglenode,Selectnodes,如标题所述,如果hashtable键与另一个XML节点的InnerText匹配,我想将新ChildNode的InnerText设置为等于hashtable值 XML示例: 正如您在脚本中看到的,我正在为每个$nodes=$xml.SelectNodes('.//alternativeExportValues')创建一个childnode。 在这里,我希望$newNode.InnerText与$scaleName=$xml.SelectSingleNode('.//name[@id=“0”]')
正如您在脚本中看到的,我正在为每个
$nodes=$xml.SelectNodes('.//alternativeExportValues')
创建一个childnode。
在这里,我希望$newNode.InnerText
与$scaleName=$xml.SelectSingleNode('.//name[@id=“0”]')的InnerText匹配时,它是相应哈希表键的哈希表值
一直在尝试使用foreach($exportValue.Keys中的key)
和foreach($exportValue.GetEnumerator()中的kvp)
,但如果运气不好,脚本基本上会永远运行
任何正确方向的帮助或指导都将不胜感激。我试图提供一个一般性的答案,但需要更多信息
在提交关于XML导航的问题时,请包含一个XML示例,其中至少包含两个您所针对的类型的节点。在本例中,我们可能需要//scales/scale和//names/name的上下文。包含几行.csv数据可能会有所帮助
这种说法可能行不通:
但也许你只是想让它成为你寻求帮助的逻辑的占位符。请澄清或偏移该文本以显示其文字
我将尝试用给出的信息回答您的问题。:)李>
您正在正确地创建元素,但看起来可能需要收紧上下文。试着这样做:
$newNode.InnerText = $exportValue[$($scalename.InnerText)]
但是,请确保您位于xml中正确的上下文节点,以便对其进行比较,并确保它们完全匹配。如果是这样,您应该能够使用该InnerText作为$exportValue哈希表的索引
很多猜测。更多信息将有所帮助。:) 您好@adamt8,我已经用一个XML和.csv文件的例子更新了这个问题。引用[$($scaleName.InnerText)]会使用所有值更新节点的InnerText(895)。希望编辑能进一步解释这个问题。你有没有发现这个问题?@Blaisem我用Python而不是Powershell实现了它。
navn;altValue
Some Text;0001
Some Text 2;0002
# Hashtable containing scale name & alt exp value (key : value)
$exportValue = @{ }
# Import .csv file holding the data
$scaleData = Import-Csv -Path '.\myCsvFile.csv' -Delimiter ';' -Encoding UTF8 |
% {
$exportValue[$_.navn] = $_.altValue
}
# scales & list XML
$xmlFile = '.\myXmlFile.xml'
[Xml]$xml = Get-Content $xmlFile -Encoding UTF8
# xPath
$scaleName = $xml.SelectNodes('.//name[@id="0"]')
# Create child node to alternativeExportValues
$nodes = $xml.SelectNodes('.//alternativeExportValues') | ForEach-Object {
$newNode = $xml.CreateElement('alternativeExportValue')
$newNode.SetAttribute("id", "0")
$newNode.InnerText = "{{key value}}"
$_.AppendChild($newNode)
}
$xml.Save('.\Result.xml')
$newNode.InnerText = '$exportValue.value if $exportValue.key matches InnerText of $scaleName'
$newNode.InnerText = $exportValue[$($scalename.InnerText)]