#c# #xml #linq #linq-to-xml
#c# #xml #linq #linq-to-xml
Вопрос:
Как правило, я записываю сообщения журнала в XML-файл. Я использую Linq
‘s XDocument
.
Обычно у меня не отвечает пользовательский интерфейс, когда журнал xml становится большим, поэтому я ищу альтернативу для достижения того же результата.
Ниже приведен отрывок из того, как я вошел в XML-файл с помощью Linq
.
// Create the xml file if it does not exist
if (!File.Exists(_filePath))
{
_xmlDocument = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"),
new XElement("Logs"));
_xmlDocument.Save(_filePath);
}
// Load the xml file
_xmlDocument = XDocument.Load(_filePath);
// Add new log to the logs
_xmlDocument?.Element("Logs")?
.AddFirst(new XElement($"{logLevel.ToString()}",
new XAttribute("Date", DateTime.Now.ToString("g")),
new XAttribute("Filepath", $"{values?[1]}"),
new XElement("Exception", new XAttribute("EventId", eventId), exception.Source),
new XElement("Message",
new XAttribute("Origin", $"{values?[0]}"),
new XAttribute("LineNumber", $"{values?[2]}"),
$"{values?[3]}")
)
);
// Save the document
_xmlDocument.Save(_filePath);
Комментарии:
1. Две вещи: 1) вы используете . addFirst который вставляет записи сверху, что означает, что многие записи должны быть перемещены с течением времени — . appendChild будет работать лучше. 2) избегайте использования ?. поскольку вы уже обеспечили доступность документа.
2. Я хочу, чтобы новые журналы всегда оставались наверху.
Ответ №1:
Одним из методов является ведение файла журнала следующим образом
<log-entry.../>
<log-entry.../>
<log-entry.../>
без заключающего элемента-оболочки. Это означает, что вы можете добавлять к нему, используя обычные методы добавления файлов. Затем, когда вы хотите прочитать его как XML, ссылайтесь на него как на внешний объект из другого файла:
<!DOCTYPE log [
<!ENTITY e SYSTEM "logdata.xml">
]>
<log>amp;e;</log>
Вы по-прежнему несете полную стоимость синтаксического анализа при чтении файла, но теперь вы можете добавлять к нему напрямую и дешево.
Конечно, недостатком является то, что сотрудники службы безопасности в наши дни параноидально относятся к внешним объектам.
Комментарии:
1. не могли бы вы указать мне какой-либо справочный материал, который мог бы помочь в реализации предложенной вами методики?
2. Хорошая книга по XML, например, книга Боба дю Шарма, расскажет вам все, что вам нужно знать о сущностях. Лично я использую XML-объекты очень мало, но иногда возникает такая проблема, когда они очень удобны.
Ответ №2:
Вы могли бы попытаться использовать XML-файл, как если бы это был datatable, вставить запись, а затем снова записать файл. Например:
DataSet oDataset = new DataSet();
oDataset.ReadXml(yourfile);
DataTable dt = oDataset.Tables["yourtable"];
//Insert a record
oDataset.WriteXml(yourfile);
Комментарии:
1. Существуют ли какие-либо компромиссы с этим методом, которые должны вызывать беспокойство?
2. Я использовал его в течение многих лет для управления файлами конфигурации, которые когда-то были файлами .ini, и у меня никогда не было проблем.