我正在尝试在XML文档中搜索属性字段中具有特定字符串的条目。如果存在该字符串,我想将整个元素复制到具有相同结构的另一个xml。
到目前为止,我能够找到元素并将其保存到数组中。我在foreach上将每个保存到XML时遇到问题。
两个XML文件结构:
> <?xml version="1.0" encoding="utf-8"?>
<ClassConfiguratorConfig
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Section>
> <SProperties>
> <SProperty Name="C_ITEM1VALUE" Value="1" />
> <SProperty Name="C_ITEM2VALUE" Value="5" />
> <SProperty Name="C_ITEM3VALUE" Value="20" />
> <SProperty Name="C_ITEM4VALUE" Value="100" />
> <SProperty Name="C_ITEM1TYPE" Value="0" />
> <SProperty Name="C_ITEM2TYPE" Value="0" />
> <SProperty Name="C_ITEM3TYPE" Value="0" />
> <SProperty Name="C_ITEM4TYPE" Value="0" />
> <SProperty Name="START_RETURNIMMEDIATELY" Value="FALSE" />
> <SProperty Name="SUPER_EXITTIMEOUT" Value="10" />
> </SProperties>
</Section>
</ClassConfiguratorConfig>
当前代码以查找SProperty的所有实例,其中SProperty1.xml中Name属性包含“ C_ITEM”。然后将所有条目添加到SProperty2.xml
[xml]$XML1 = Get-Content "C:\Temp\SProperty1.XML"
[xml]$XML2 = Get-Content "C:\Temp\SProperty2.XML"
$Node1 = $XML1.ClassConfiguratorConfig.Section.SProperties
$Node2 = $XML2.ClassConfiguratorConfig.Section.SProperties
$Nodes = $XML1.SelectNodes("//SProperties/*[@*[contains(.,'C_ITEM')]]")
foreach ($Node in $Nodes){
$XML2.CreateElement('SProperty')
$Child.SetAttribute('Name',"$Node.Name")
$Child.SetAttribute('Value',"$Node.Value")
$Node2.AppendChild($Child)
}
当出于某种原因进行for循环处理时,我得到以下输出:
Name Value
---- -----
System.Xml.XmlElement.Name System.Xml.XmlElement.Value
System.Xml.XmlElement.Name System.Xml.XmlElement.Value
System.Xml.XmlElement.Name System.Xml.XmlElement.Value
System.Xml.XmlElement.Name System.Xml.XmlElement.Value
System.Xml.XmlElement.Name System.Xml.XmlElement.Value
System.Xml.XmlElement.Name System.Xml.XmlElement.Value
任何帮助将不胜感激
这是因为在变量周围使用“”时,您在$()中没有值。
$child = $XML2.CreateElement('SProperty')
$Child.SetAttribute('Name',"$($Node.Name)")
$Child.SetAttribute('Value',"$($Node.Value)")
如果您尝试从$ Node获取Name的值,则('Name',"$Node.Name")
不正确。本质上,您是将属性名称设置为"$Node" + ".Node"
,将值设置为"$Node" + ".Value"
。
为了使powershell知道您正在尝试访问Node的Name或Value属性,您必须在“”中使用完整的变量,这是通过将$ variable和属性名用@()封装来完成的。因此,"$($Node.Name)"
将起作用。
用法应该是这样,('Name',"$($Node.Name)")