Добавить элемент XML в сложный файл XML с помощью Powershell - PullRequest
1 голос
/ 05 апреля 2020

У меня есть очень сложная задача для Powershell по удаленной работе для меня. Это сложно объяснить, но я постараюсь. У меня есть XML файл со сложной структурой (это файл с настройками для Visual Studio):

<UserSettings>
<ToolsOptions>
<ToolsOptionsCategory RegisteredName="Environment" name="Environment">
</ToolsOptionsCategory>
</ToolsOptions>
</UserSettings>

Задача добавить в раздел "ToolsOptionsCategory" следующий подузел:

<ToolsOptionsSubCategory PackageName="VS Setup Composition" RegisteredName="ProductUpdates" name="ProductUpdates">
<PropertyValue name="IsBackground">true</PropertyValue>
</ToolsOptionsSubCategory>

Я пытался добавить AppendChild и CreateElement, но не представляю, как добавить такие атрибуты, как «PackageName» и «RegistereName». Этот подузел отсутствует в целевом файле, и мне нужно добавить его. Было бы здорово, если бы вы могли мне помочь и показать мне дорогу.

Заранее спасибо! Будьте здоровы и оставайтесь дома :)

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Для демонстрации я использую Here-String

[xml]$xml = @"
<UserSettings>
<ToolsOptions>
<ToolsOptionsCategory RegisteredName="Environment" name="Environment">
</ToolsOptionsCategory>
</ToolsOptions>
</UserSettings>
"@

В реальной жизни вы можете загрузить его из файла с помощью [xml]$xml = Get-Content -Path 'D:\config.xml'

$node = $xml.UserSettings.ToolsOptions.ToolsOptionsCategory
# update the attributes for this node
$node.SetAttribute("PackageName", "VS Setup Composition")
$node.SetAttribute("RegisteredName", "ProductUpdates")
$node.SetAttribute("name", "ProductUpdates")
# create the new sub node (XmlElement)
$newNode = $xml.CreateElement("PropertyValue")
$newNode.SetAttribute("name", "IsBackground")
$newNode.InnerText = "true"
# add this new subnode to the 'ToolsOptionsCategory' node
$node.AppendChild($newNode)

$xml.Save('D:\newConfig.xml')

Результат:

<UserSettings>
  <ToolsOptions>
    <ToolsOptionsCategory RegisteredName="ProductUpdates" name="ProductUpdates" PackageName="VS Setup Composition">
      <PropertyValue name="IsBackground">true</PropertyValue>
    </ToolsOptionsCategory>
  </ToolsOptions>
</UserSettings>
1 голос
/ 05 апреля 2020

Вот еще один способ сделать это. Я добавил комментарии, чтобы объяснить подход.

# Create XML object to load data into
$xml = New-Object -TypeName System.Xml.XmlDocument

# Load in XML file
$xml.Load("test.xml")

# Get root tools node to add children
$toolsRootNode = $xml.UserSettings.ToolsOptions.ToolsOptionsCategory

# Store attributes in a hashtable
$toolsAttributes = [ordered]@{
    PackageName="Setup Composition"
    RegisteredName="ProductUpdates"
    name="ProductUpdates"
}

# Set each attribute from hashtable
$toolsSubNode = $xml.CreateElement("ToolsOptionsSubCategory")
foreach ($kvp in $toolsAttributes.GetEnumerator())
{
    $toolsSubNode.SetAttribute($kvp.Key, $kvp.Value)
}

# Create property sub node
$propertyNode = $xml.CreateElement("PropertyValue")
$propertyNode.SetAttribute("name", "IsBackground")
$propertyNode.InnerText = "true"

# Append property node to tools sub node
$toolsSubNode.AppendChild($propertyNode)

# Finally add tools sub node to root node
$toolsRootNode.AppendChild($toolsSubNode)

# Save to new output XML file
$xml.Save("output.xml")

выход. xml

<UserSettings>
  <ToolsOptions>
    <ToolsOptionsCategory RegisteredName="Environment" name="Environment">
      <ToolsOptionsSubCategory PackageName="Setup Composition" RegisteredName="ProductUpdates" name="ProductUpdates">
        <PropertyValue name="IsBackground">true</PropertyValue>
      </ToolsOptionsSubCategory>
    </ToolsOptionsCategory>
  </ToolsOptions>
</UserSettings>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...