Разделите XML-документ на части, создав несколько выходных файлов из повторяющихся элементов

Мне нужно взять XML-файл и создать несколько выходных XML-файлов из повторяющихся узлов входного файла. Исходный файл & quot; AnimalBatch.xml & quot; выглядит так:

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

Программа должна разбить повторяющееся «Животное» и создайте 3 файла с именами: Animal_1001.xml, Animal_1002.xml и Animal_1003.xml

Каждый выходной файл должен содержать только соответствующий элемент (который будет корневым). Атрибут id из AnimalsBatch.xml предоставит порядковый номер для имен файлов Animal_xxxx.xml. Атрибут id не обязательно должен быть в выходных файлах.

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 & GT;
<?xml version="1.0" encoding="utf-8"?>
<Animal>
<Quantity>Three</Quantity>
<Adjective>Blind</Adjective>
<Name>Mice</Name>
</Animal>

Я хочу сделать это с XmlDocument, так как он должен быть в состоянии работать на .Net 2.0.

Моя программа выглядит так:

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

Я думаю, у меня есть 2 проблемы.

A) После выполнения ImportNode на узле n в outdoc я вызываю outdoc. AppendChild (n), который жалуется: «Узел, который нужно вставить, находится в другом контексте документа». Я не знаю, является ли это проблемой области действия, ссылающейся на узел n в цикле ForEach - или я как-то не правильно использую ImportNode () или AppendChild. 2-й аргумент в ImportNode () имеет значение true, потому что я хочу, чтобы дочерние элементы Animal (3 поля с произвольным названием Количество, Прилагательное и Имя) оказались в конечном файле.

Б) Вторая проблема - получить элемент Animal в outdoc. Я получаю "Я" но мне нужно & apos; & APOS; так что я могу разместить узел n внутри него. Я думаю, что моя проблема в том, как я это делаю: outdoc.AppendChild (rootnode);

Чтобы показать xml, я делаю: outdoc.Save (Console.Out); У меня есть код для сохранения () в выходной файл - который работает, если я могу правильно собрать outdoc.

Есть похожий вопрос по адресу:Разделить XML на несколько файлов XML, но я пока не понимаю код решения. Я думаю, что я довольно близок к этому подходу и буду признателен за любую помощь, которую вы можете оказать.

Я собираюсь выполнить ту же задачу с помощью XmlReader, поскольку мне потребуется возможность обрабатывать большие входные файлы, и я понимаю, что XmlDocument считывает все это и может вызвать проблемы с памятью.

Ответы на вопрос(2)

Ваш ответ на вопрос