Как правило, если у вас есть данные XML, которые вы хотите изменить (а не просто прочитать), и данные имеют достаточно маленький размер (чтобы не загружать массивные объекты в память), вам следует использовать документ некоторого Добрый. Из-за его способности использовать XPath, я бы порекомендовал XmlDocument. (XPath упрощает проблему такого рода.)
Как вы правильно заметили, вам понадобится один корень XML. Это легко решить, просто поместите все данные, которые у вас есть, в другой корневой узел.
Итак, вот код, который должен помочь.
$data = @"
<UserBlob>
<Item>
<Key>SomeKey</Key>
<Value>false</Value>
</Item>
<Item>
<Key>AnotherKey</Key>
<Value></Value>
</Item>
</UserBlob>
<PrimaryServerBlob>
<Item>
<Key>Just a key</Key>
<Value></Value>
</Item>
<Item>
<Key>And another key</Key>
<Value>true</Value>
</Item>
</PrimaryServerBlob>
"@
$wrappedData = "<root>$data</root>"
$doc = new-object Xml.XmlDocument
$doc.LoadXml($wrappedData)
$nodeToChange = $doc.SelectSingleNode("/root/UserBlob/Item[Key='SomeKey']")
if($nodeToChange){
$nodeToChange.Value = "NEW VALUE"
}
$doc.Save("[PATH_TO_OUTPUT_FILE]")
Я упустил обработку ошибок и правильное удаление объектов для краткости. Я оставлю это на ваше усмотрение. : -)
Для получения дополнительной информации о XmlDocument см. Документацию .
UPDATE
Чтобы снова удалить дополнительный корневой документ, просто используйте его, чтобы получить его в виде строки.
$newWrappedData = $doc.Root.InnerXml
Затем сохраните строку, используя StreamWriter или File.CreateText или что-то еще.