Divide o documento XML, criando vários arquivos de saída a partir de elementos repetidos

Eu preciso pegar um arquivo XML e criar vários arquivos xml de saída dos nós de repetição do arquivo de entrada. O arquivo de origem "AnimalBatch.xml" se parece com isto:

<?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>

O programa precisa dividir o "Animal" repetitivo e produzir 3 arquivos chamados: Animal_1001.xml, Animal_1002.xml e Animal_1003.xml

Cada arquivo de saída deve conter apenas seu respectivo elemento (que será a raiz). O atributo id de AnimalsBatch.xml fornecerá o número de seqüência para os nomes de arquivos Animal_xxxx.xml. O atributo id não precisa estar nos arquivos de saída.

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>

Eu quero fazer isso com XmlDocument, uma vez que precisa ser capaz de rodar em .net 2.0.

Meu programa é assim:

    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();
    }

Eu acho que tenho 2 problemas.

A) Depois de fazer o ImportNode no nó n em outdoc, eu chamo outdoc.AppendChild (n) que reclama: "O nó a ser inserido é de um contexto de documento diferente." Eu não sei se isso é um problema de escopo referenciando o nó n dentro do loop ForEach - ou se eu não estou usando de alguma forma o ImportNode () ou AppendChild corretamente. O segundo argumento em ImportNode () está definido como true, porque eu quero que os elementos filhos de Animal (3 campos arbitrariamente chamados Quantity, Adjective e Name) terminem no arquivo de destino.

B) O segundo problema é colocar o elemento Animal no outdoc. Estou recebendo "mas preciso" para poder colocar o nó n dentro dele. Eu acho que o meu problema é como eu estou fazendo: outdoc.AppendChild (rootnode);

Para mostrar o xml, estou fazendo: outdoc.Save (Console.Out); Eu tenho o código para salvar () para um arquivo de saída - o que funciona, desde que eu possa montar o outdoc adequadamente.

Há uma pergunta semelhante em:Dividir XML em vários arquivos XML, mas ainda não entendi o código da solução. Eu acho que estou muito perto desta abordagem e apreciarei qualquer ajuda que você possa fornecer.

Eu vou estar fazendo essa mesma tarefa usando XmlReader, uma vez que eu vou precisar lidar com grandes arquivos de entrada, e eu entendo que o XmlDocument lê tudo e pode causar problemas de memória.

questionAnswers(2)

yourAnswerToTheQuestion