Rozdziel dokument XML, tworząc wiele plików wyjściowych z powtarzających się elementów

Muszę pobrać plik XML i utworzyć wiele wyjściowych plików xml z powtarzających się węzłów pliku wejściowego. Plik źródłowy „AnimalBatch.xml” wygląda tak:

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

Program musi podzielić powtarzające się „zwierzę” i utworzyć 3 pliki o nazwach: Animal_1001.xml, Animal_1002.xml i Animal_1003.xml

Każdy plik wyjściowy powinien zawierać tylko odpowiedni element (który będzie rootem). Atrybut id z AnimalsBatch.xml poda numer kolejny dla nazw plików Animal_xxxx.xml. Atrybut id nie musi znajdować się w plikach wyjściowych.

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>

Chcę to zrobić za pomocą XmlDocument, ponieważ musi on być w stanie działać na .Net 2.0.

Mój program wygląda tak:

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

Myślę, że mam 2 problemy.

A) Po wykonaniu polecenia ImportNode na węźle n w outdoc, wywołuję outdoc.AppendChild (n), który narzeka: „Wstawiony węzeł pochodzi z innego kontekstu dokumentu”. Nie wiem, czy jest to problem dotyczący zakresu w węźle n w pętli ForEach - czy też nie korzystam właściwie z ImportNode () lub AppendChild. Drugi argument w ImportNode () jest ustawiony na true, ponieważ chcę, aby elementy potomne Animal (3 pola arbitralnie nazwane Quantity, Adjective i Name) trafiły do ​​pliku docelowego.

B) Drugi problem polega na umieszczeniu elementu Animal w Outdoc. Dostaję „ale potrzebuję”, więc mogę umieścić w nim węzeł n. Myślę, że moim problemem jest to, jak robię: outdoc.AppendChild (rootnode);

Aby pokazać xml, robię: outdoc.Save (Console.Out); Mam kod do zapisania () do pliku wyjściowego - który działa, o ile mogę poprawnie zainstalować outdoc.

Podobne pytanie dotyczy:Podziel XML w wielu plikach XML, ale nie rozumiem jeszcze kodu rozwiązania. Myślę, że jestem blisko tego podejścia i docenię każdą pomoc, jaką możesz zapewnić.

Będę robił to samo zadanie przy użyciu XmlReader, ponieważ będę potrzebował obsługiwać duże pliki wejściowe i rozumiem, że XmlDocument wczytuje całość i może powodować problemy z pamięcią.

questionAnswers(2)

yourAnswerToTheQuestion