Разделите 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 считывает все это и может вызвать проблемы с памятью.