Powershell - Поиск XML для элемента с определенным именем и добавление их в другой XML документ - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь найти в документе 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, где указан атрибут Name содержит "C_ITEM" в SProperty1. xml. Затем добавьте все записи этого в 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)
   }

Когда для процесса l oop по какой-то причине я получаю ниже в качестве вывода:

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

Любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 29 января 2020

Это потому, что у вас нет значения внутри $ (), когда вы используете "" вокруг переменной.

       $child = $XML2.CreateElement('SProperty')
       $Child.SetAttribute('Name',"$($Node.Name)")  
       $Child.SetAttribute('Value',"$($Node.Value)")

('Name',"$Node.Name") неверно, если вы пытаетесь получить значение Name из $ Node. По сути, вы устанавливаете для атрибута Name значение "$Node" + ".Node" и значение "$Node" + ".Value".

Чтобы PowerShell узнала, что вы пытаетесь получить доступ к свойству Name или Value узла, вы должны использовать полную переменную внутри "", и это делается путем инкапсуляции переменной $ и имени свойства с помощью @ ( ). Итак, "$($Node.Name)" будет работать.

Использование должно быть таким, ('Name',"$($Node.Name)")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...