Используя LINQ to XML, что-то вроде
XElement rootElem = ... //load this however you happen to
foreach (var component in rootElem.Elements("component"))
component.Save(your-XmlWriter-here); //you'll want a distinct writer per file
должно работать нормально; для вашего конкретного примера ...
string xml =@"
<components>
<component name='a'/>
<component name='b'/>
<component name='c'/>
</components>
";
foreach (XElement component in XElement.Parse(xml).Elements() )
component.Save(component.Attribute("name").Value + ".xml");
работает точно так, как указано. Тем не менее, я считаю хорошей практикой избегать работы с конкретными именами файлов, где это возможно, поскольку достаточно часто ваш XML может обрабатываться непосредственно позже в конвейере без необходимости промежуточного (подверженного ошибкам и медленного) сохранения файла. Например, на веб-сервере не очевидно, что у вас даже будут права на запись чего-либо, поэтому вы уменьшаете переносимость, заставляя использовать реальный файл.