Separe el documento XML creando varios archivos de salida de elementos repetidos

Necesito tomar un archivo XML y crear múltiples archivos xml de salida desde los nodos de repetición del archivo de entrada. El archivo fuente "AnimalBatch.xml" se ve así:

<?xml version="1.0" encoding="utf-8" ?>
<Animals>
<Animal id="1001">
<Quantity>One</Quantity>
<Adjective>Red</Adjective>
<Name>Rooster</Name>
</Animal>
<Animal id="1002">
<Quantity>Two</Quantity>
<Adjective>Stubborn</Adjective>
<Name>Donkeys</Name>
</Animal>
<Animal id="1003">
<Quantity>Three</Quantity>
<Color>Blind</Color>
<Name>Mice</Name>
</Animal>
</Animals>

El programa debe dividir el "Animal" repetido y producir 3 archivos llamados: Animal_1001.xml, Animal_1002.xml y Animal_1003.xml

Cada archivo de salida debe contener solo su elemento respectivo (que será la raíz). El atributo id de AnimalsBatch.xml proporcionará el número de secuencia para los nombres de archivo Animal_xxxx.xml. El atributo id no necesita estar en los archivos de salida.

Animal_1001.xml:
<?xml version="1.0" encoding="utf-8"?>
<Animal>
<Quantity>One</Quantity>
<Adjective>Red</Adjective>
<Name>Rooster</Name>
</Animal>

Animal_1002.xml
<?xml version="1.0" encoding="utf-8"?>
<Animal>
<Quantity>Two</Quantity>
<Adjective>Stubborn</Adjective>
<Name>Donkeys</Name>
</Animal>

Animal_1003.xml>
<?xml version="1.0" encoding="utf-8"?>
<Animal>
<Quantity>Three</Quantity>
<Adjective>Blind</Adjective>
<Name>Mice</Name>
</Animal>

Quiero hacer esto con XmlDocument, ya que debe poder ejecutarse en .Net 2.0.

Mi programa se ve así:

    static void Main(string[] args)
    {
        string strFileName;    
        string strSeq;                    

        XmlDocument doc = new XmlDocument(); 
        doc.Load("D:\\Rick\\Computer\\XML\\AnimalBatch.xml");

        XmlNodeList nl = doc.DocumentElement.SelectNodes("Animal");

        foreach (XmlNode n in nl)
        {
            strSeq = n.Attributes["id"].Value;

            XmlDocument outdoc = new XmlDocument();
            XmlNode rootnode = outdoc.CreateNode("element", "Animal", "");

            outdoc.AppendChild(rootnode); // Put the wrapper element into outdoc

            outdoc.ImportNode(n, true);   // place the node n into outdoc
            outdoc.AppendChild(n);        // This statement errors:
            // "The node to be inserted is from a different document context."

            strFileName = "Animal_" + strSeq + ".xml";

            outdoc.Save(Console.Out);
            Console.WriteLine();
        }
        Console.WriteLine("END OF PROGRAM:  Press <ENTER>");
        Console.ReadLine();
    }

Creo que tengo 2 problemas.

A) Después de hacer ImportNode en el nodo n en outdoc, llamo a outdoc.AppendChild (n) que se queja: "El nodo que se insertará es de un contexto de documento diferente". No sé si este es un problema de alcance que hace referencia al nodo n dentro del bucle ForEach, o si de alguna manera no estoy usando ImportNode () o AppendChild correctamente. El segundo argumento en ImportNode () se establece en verdadero, porque quiero que los elementos secundarios de Animal (3 campos nombrados arbitrariamente Cantidad, Adjetivo y Nombre) terminen en el archivo de destino.

B) El segundo problema es hacer que el elemento Animal se convierta en outdoc. Estoy recibiendo "pero necesito" para poder colocar el nodo n dentro de él. Creo que mi problema es cómo lo estoy haciendo: outdoc.AppendChild (rootnode);

Para mostrar el xml, estoy haciendo: outdoc.Save (Console.Out); Tengo el código para guardar () en un archivo de salida, lo que sí funciona, siempre y cuando pueda ensamblarlo de manera apropiada.

Hay una pregunta similar en:Dividir XML en múltiples archivos XML, pero no entiendo el código de la solución todavía. Creo que estoy muy cerca de este enfoque y apreciaré cualquier ayuda que pueda brindar.

Haré esta misma tarea usando XmlReader, ya que tendré que ser capaz de manejar archivos de entrada grandes, y entiendo que XmlDocument lee todo y puede causar problemas de memoria.

Respuestas a la pregunta(2)

Su respuesta a la pregunta