Есть ли способ добавить новые XML-данные к уже существующему xml в XML-файле без использования XDocument?

#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, и у меня никогда не было проблем.