Powershell-使用特定名称搜索XML并将其添加到另一个XML文档中

问题描述 投票:0回答:1

我正在尝试在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

任何帮助将不胜感激

arrays xml powershell copy
1个回答
0
投票

这是因为在变量周围使用“”时,您在$()中没有值。

       $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)")

© www.soinside.com 2019 - 2024. All rights reserved.