Инкрементная запись XML XDocument на диск с сохранением действительного XML - PullRequest
2 голосов
/ 12 августа 2011

Я записываю некоторые события журнала в файл XML, каждые 5 минут я запускаю новый файл. Я использую XDocument и XElement, которые мне действительно нравятся,

 _xDocument = XDocument.Parse("<LogEntires/>");
 _xDocument.Root.Add(xElementLogEventList.ToArray());
 _xDocument.Save(_outFileName);

Я бы хотел сохранять его на диске каждые 10 секунд или около того с помощью таймера, чтобы самые последние события были не только в памяти, и люди могли при необходимости просматривать файл. Но у XDocument есть только методы Save () и WriteTo (), которые пишут весь документ. И, думаю, без тега это будет неверный Xml в любом случае.

Моя следующая мысль - использовать XmlWriter и время от времени очищать мой FileStream, отслеживая добавление самого закрывающего тега ... и просто иметь недопустимый XML, пока я полностью не закончу и не закрою файл.

Мне бы очень хотелось, чтобы на диске был действительный Xml, и если я хочу написать корневой тег, а затем через пять или десять секунд, когда я сделаю следующий сброс, просто сделайте резервную копию и удалите корневой тег, добавьте следующую сотню элементы и написать и очистить поток. xmlWriter только вперед, поэтому я не уверен, что это самый эффективный способ сделать это.

Каков наиболее эффективный способ иметь действительный xml на диске, но продолжать передавать новые элементы в конце, а не переписывать весь документ каждый раз? Я боюсь, что мне не хватает чего-то очевидного, такого как xDocument.AppendUpdatesToFile (_outfile) или чего-то такого очевидного ...

Если нет, то как бы вы эффективно нашли и удалили окончательный корневой тег и добавили новые элементы в потоковом режиме?

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

XML не подходит для такого рода обновлений на диске.

Подумайте об использовании коллекции фрагментов XML (по сути, пропуская начальный открывающий тег), если вам нужно придерживаться XML.

0 голосов
/ 12 августа 2011

Простой (хотя и не очень эффективный) способ сделать это - создать файл, как вы делаете, и после сохранения, включая тег, вы можете «добавлять» записи, загружая его (так часто, как это необходимо) и используя что-то похожее на

xmlDoc.Element("Persons").Add(new XElement("Person", new XElement("Name", txtName.Text),
new XElement("City", txtCity.Text), new XElement("Age", txtAge.Text)));

, затем просто сохраните его ... оно остается в силе ...

для примера кода см. http://www.linqhelp.com/linq-tutorials/adding-to-xml-file-using-linq-and-c/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...