Запись журналов в файл XML с помощью .NET - PullRequest
5 голосов
/ 14 июля 2009

Я храню журналы в XML-файле ...

В традиционном подходе с прямым текстовым форматом у вас обычно есть просто openFile ... затем метод writeLine ...

Как можно добавить новую запись в структуру документа xml, как если бы вы использовали подход с текстовыми файлами?

Ответы [ 8 ]

4 голосов
/ 14 июля 2009

используйте XmlWriter.

пример кода:

    public class Quote
    {
        public string symbol;
        public double price;
        public double change;
        public int volume;
    }


    public void Run()
    {
        Quote q = new Quote
            {
                symbol = "fff",
                price = 19.86,
                change = 1.23,
                volume = 190393,
                };
        WriteDocument(q);
    }



    public void WriteDocument(Quote q) 
    {
        var settings = new System.Xml.XmlWriterSettings
            {
                OmitXmlDeclaration = true,
                Indent= true
            };

        using (XmlWriter writer = XmlWriter.Create(Console.Out, settings))
        {
            writer.WriteStartElement("Stock");
            writer.WriteAttributeString("Symbol", q.symbol);
            writer.WriteElementString("Price", XmlConvert.ToString(q.price));
            writer.WriteElementString("Change", XmlConvert.ToString(q.change));
            writer.WriteElementString("Volume", XmlConvert.ToString(q.volume));
            writer.WriteEndElement();
        }
    }

пример вывода:

<Stock Symbol="fff">
  <Price>19.86</Price>
  <Change>1.23</Change>
  <Volume>190393</Volume>
</Stock>

см Запись с помощью XmlWriter для получения дополнительной информации.

1 голос
/ 14 апреля 2015

Извините, что опубликовал ответ на старую тему. я разработал то же самое давным-давно. здесь я хотел бы поделиться своим полным кодом для сохраненных в журнале данных данных журнала в формате xml.

код класса регистратора

using System.IO;
using System.Xml;
using System.Threading;

public class BBALogger
    {
        public enum MsgType
        {
            Error ,
            Info 
        }

        public static BBALogger Instance
        {
            get
            {
                if (_Instance == null)
                {
                    lock (_SyncRoot)
                    {
                        if (_Instance == null)
                            _Instance = new BBALogger();
                    }
                }
                return _Instance;
            }
        }

        private static BBALogger _Instance;
        private static object _SyncRoot = new Object();
        private static ReaderWriterLockSlim _readWriteLock = new ReaderWriterLockSlim();

        private BBALogger()
        {
            LogFileName = DateTime.Now.ToString("dd-MM-yyyy");
            LogFileExtension = ".xml";
            LogPath= Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\Log";
        }

        public StreamWriter Writer { get; set; }

        public string LogPath { get; set; }

        public string LogFileName { get; set; }

        public string LogFileExtension { get; set; }

        public string LogFile { get { return LogFileName + LogFileExtension; } }

        public string LogFullPath { get { return Path.Combine(LogPath, LogFile); } }

        public bool LogExists { get { return File.Exists(LogFullPath); } }

        public void WriteToLog(String inLogMessage, MsgType msgtype)
        {
            _readWriteLock.EnterWriteLock();
            try
            {
                LogFileName = DateTime.Now.ToString("dd-MM-yyyy");

                if (!Directory.Exists(LogPath))
                {
                    Directory.CreateDirectory(LogPath);
                }

                var settings = new System.Xml.XmlWriterSettings
                {
                    OmitXmlDeclaration = true,
                    Indent = true
                };

                StringBuilder sbuilder = new StringBuilder();
                using (StringWriter sw = new StringWriter(sbuilder))
                {
                    using (XmlWriter w = XmlWriter.Create(sw, settings))
                    {
                        w.WriteStartElement("LogInfo");
                        w.WriteElementString("Time", DateTime.Now.ToString());
                        if (msgtype == MsgType.Error)
                            w.WriteElementString("Error", inLogMessage);
                        else if (msgtype == MsgType.Info)
                            w.WriteElementString("Info", inLogMessage);

                        w.WriteEndElement();
                    }
                }
                using (StreamWriter Writer = new StreamWriter(LogFullPath, true, Encoding.UTF8))
                {
                    Writer.WriteLine(sbuilder.ToString());
                }
            }
            catch (Exception ex)
            {

            }
            finally
            {
                _readWriteLock.ExitWriteLock();
            }
        }

        public static void Write(String inLogMessage, MsgType msgtype)
        {
            Instance.WriteToLog(inLogMessage, msgtype);
        }
    }

Вызов или использование таким образом

    BBALogger.Write("pp1", BBALogger.MsgType.Error);
    BBALogger.Write("pp2", BBALogger.MsgType.Error);
    BBALogger.Write("pp3", BBALogger.MsgType.Info);
    MessageBox.Show("done");

пусть мой код поможет вам и другим:)

1 голос
/ 14 апреля 2010

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

Хорошим решением было бы объединить два XML-файла, используя XML-включаемую вещь:

Заголовочный файл:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log [
<!ENTITY loglines SYSTEM "loglines.xml">
]>
<log>
&loglines;
</log>

Файл строк (в данном примере с именем loglines.xml):

<logline date="2007-07-01 13:56:04.313" text="start process" />
<logline date="2007-07-01 13:56:25.837" text="do something" />
<logline date="2007-07-01 13:56:25.853" text="the end" />

Затем вы можете добавлять новые строки в «файл строк», но (большинство) анализаторы XML смогут открывать файл заголовка и правильно читать строки.

Филип отмечает, что: Этот XML не будет правильно обрабатываться каждым анализатором XML на планете. Но все парсеры, которые я использовал, делают это правильно.

1 голос
/ 14 июля 2009

Зачем изобретать велосипед? Используйте класс TraceSource (System.Diagnostics) с XmlWriterTraceListener .

1 голос
/ 14 июля 2009

Большая разница в том, как вы думаете о ваших данных журнала. В текстовых файлах вы действительно просто добавляете новые строки. Однако XML - это древовидная структура, и вам нужно думать об этом. То, что вы добавляете, - это, вероятно, еще одно УЗЕЛ, т.е.

<log>
   <time>12:30:03 PST</time>
   <user>joe</user>
   <action>login</action>
<log>

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

0 голосов
/ 14 июля 2009

Для редактирования XML-файла вы также можете использовать LINQ. Вы можете посмотреть, как здесь: http://www.linqhelp.com/linq-tutorials/adding-to-xml-file-using-linq-and-c/

0 голосов
/ 14 июля 2009

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

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

Если вы пишете журнал выполненного рабочего модуля или журнал, который не нужно проверять, пока все не закончится, вы можете использовать свой подход - просто открыть файл, написать строки журнала, закрыть файл, когда работа завершена.

0 голосов
/ 14 июля 2009

Без дополнительной информации о том, что вы делаете, я могу лишь дать несколько простых советов.

Существует метод для большинства объектов XML, который называется "AppendChild". Вы можете использовать этот метод, чтобы добавить новый узел, который вы создаете, с комментарием журнала. Этот узел появится в конце списка элементов. Вы бы использовали родительский элемент, где все узлы журнала находятся в качестве объекта для вызова.

Надеюсь, это поможет.

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