Using LINQ to XML, something along the lines of
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
should work fine; for your specific example...
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");
works exactly as specified. However, I find it to be good practice to avoid dealing with specific file names where possible, since often enough your XML can be processed directly later on in the pipeline without needing an intermediate (error-prone and slow) file save. For example, on a web-server it's not obvious you'll even have permissions to write anything, so you're reducing portability by forcing the usage of an actual file.