Я просто хочу протестировать код в эти выходные или в начале следующей недели, и если он ответил на мой вопрос, который, глядя на ваш код, похоже, должен, я обязательно отмечу ваш ответ как решение моей проблемы; ).

могу прочитать следующий XML-файл в список:

Частичный файл XML (data.log)

<ApplicationLogEventObject>
    <EventType>Message</EventType>
    <DateStamp>10/13/2016 11:15:00 AM</DateStamp>
    <ShortDescription>N/A</ShortDescription>
    <LongDescription>Sending 'required orders' email.</LongDescription>
</ApplicationLogEventObject>
<ApplicationLogEventObject>
    <EventType>Message</EventType>
    <DateStamp>10/13/2016 11:15:10 AM</DateStamp>
    <ShortDescription>N/A</ShortDescription>
    <LongDescription>Branches Not Placed Orders - 1018</LongDescription>
</ApplicationLogEventObject>
<ApplicationLogEventObject>
    <EventType>Message</EventType>
    <DateStamp>10/13/2016 11:15:10 AM</DateStamp>
    <ShortDescription>N/A</ShortDescription>
    <LongDescription>Branches Not Placed Orders - 1019</LongDescription>
</ApplicationLogEventObject>
...

А вот и уровень доступа к данным (DAL):

public List<FLM.DataTypes.ApplicationLogEventObject> Get()
    {
        try
        {
            XmlTextReader xmlTextReader = new XmlTextReader(@"C:\data.log");
        List<FLM.DataTypes.ApplicationLogEventObject> recordSet = new List<ApplicationLogEventObject>();

        xmlTextReader.Read();

        while (xmlTextReader.Read())
        {
            xmlTextReader.MoveToElement();
            FLM.DataTypes.ApplicationLogEventObject record = new ApplicationLogEventObject();

            record.EventType = xmlTextReader.GetAttribute("EventType").ToString();
            record.DateStamp = Convert.ToDateTime(xmlTextReader.GetAttribute("DateStamp"));
            record.ShortDescription = xmlTextReader.GetAttribute("ShortDescription").ToString()                    
            record.LongDescription = xmlTextReader.GetAttribute("LongDescription").ToString();

            recordSet.Add(record);
        }
        return recordSet;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

И типы данных, которые будут содержать дочерние элементы из файла XML:

public class ApplicationLogEventObject
{
    public string EventType { get; set; }
    public DateTime DateStamp { get; set; }
    public string ShortDescription { get; set; }
    public string LongDescription { get; set; }
}

После того, как я прочитал дочерние узлы в список, я бы хотел вернуть его и отобразить в DataGridView.

Любая помощь по этому вопросу будет высоко ценится.

 rene28 сент. 2017 г., 20:36
Выглядит нормально, в чем проблема?
 JEllery28 сент. 2017 г., 20:37
Возможный дубликат:stackoverflow.com/questions/9619324/...
 Lindos Pechos28 сент. 2017 г., 20:48
Вы используете GetAttribute, который получит значение атрибута, а не значение содержимого узла. (т.е. <MyNode MyAttribute = "Foo">.
 Timothy Kruger28 сент. 2017 г., 20:44
Проблема заключается в том, что данные не возвращаются, т. Е. Сообщение, 13.10.2016, 11:15:00, N / A, отправка электронной почты «необходимые заказы». и т.д...
 rene28 сент. 2017 г., 20:40
Проблема в том, что вам нужно читать фрагменты?msdn.microsoft.com/en-us/library/...

Ответы на вопрос(1)

Решение Вопроса

лжен иметь один и только одинкорневой элементЭто серия XML-документов, соединенных вместе. Такая серия документов может быть прочитанаXmlReader установивXmlReaderSettings.ConformanceLevel == ConformanceLevel.Fragment, Сделав это, вы можете прочитать файл и десериализовать каждый корневой элемент в отдельности, используяXmlSerializer следующее:

static List<ApplicationLogEventObject> ReadEvents(string fileName)
{
    return ReadObjects<ApplicationLogEventObject>(fileName);
}

static List<T> ReadObjects<T>(string fileName)
{
    var list = new List<T>();

    var serializer = new XmlSerializer(typeof(T));
    var settings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };
    using (var textReader = new StreamReader(fileName))
    using (var xmlTextReader = XmlReader.Create(textReader, settings))
    {
        while (xmlTextReader.Read())
        {   // Skip whitespace
            if (xmlTextReader.NodeType == XmlNodeType.Element) 
            {
                using (var subReader = xmlTextReader.ReadSubtree())
                {
                    var logEvent = (T)serializer.Deserialize(subReader);
                    list.Add(logEvent);
                }
            }
        }
    }

    return list;            
}

Используя следующую версиюApplicationLogEventObject:

public class ApplicationLogEventObject
{
    public string EventType { get; set; }

    [XmlElement("DateStamp")]
    public string DateStampString { 
        get
        {
            // Replace with culturally invariant desired formatting.
            return DateStamp.ToString(CultureInfo.InvariantCulture);
        }
        set
        {
            DateStamp = Convert.ToDateTime(value, CultureInfo.InvariantCulture);
        }
    }

    [XmlIgnore]
    public DateTime DateStamp { get; set; }

    public string ShortDescription { get; set; }
    public string LongDescription { get; set; }
}

Образец.Net fiddle.

Примечания:

<DateStamp> значения элемента10/13/2016 11:15:00 AM не в правильном формате для даты и времени в XML, которыйISO 8601, Таким образом, я ввел суррогатstring DateStampString свойство, чтобы вручную обрабатывать преобразование из и в нужный формат, а затем помечены оригиналDateTime собственность сXmlIgnore.

С помощьюReadSubtree() предотвращает возможность чтения после конца каждого корневого элемента, когда XML не имеет отступа.

Согласнодокументация заXmlTextReader:

Начиная с .NET Framework 2.0, мы рекомендуем вместо этого использовать класс System.Xml.XmlReader.

Поэтому я рекомендую заменить использование этого типа наXmlReader.

Дочерние узлы вашего<ApplicationLogEventObject> элементы не атрибуты, поэтомуXmlReader.GetAttribute() не был подходящим методом для их чтения.

Учитывая, что ваши файлы журналов не форматируют свое время в ISO 8601, вы должны по крайней мере убедиться, что они отформатированы в культурно-инвариантном формате, чтобы файлы журналов могли обмениваться между компьютерами с различными региональными настройками. Делать ваши конверсии, используяCultureInfo.InvariantCulture обеспечивает это.

 Timothy Kruger28 сент. 2017 г., 21:20
Огромное спасибо большое за код и объяснение dbc, ценю это.
 Timothy Kruger29 сент. 2017 г., 15:26
Я просто хочу протестировать код в эти выходные или в начале следующей недели, и если он ответил на мой вопрос, который, глядя на ваш код, похоже, должен, я обязательно отмечу ваш ответ как решение моей проблемы; ).

Ваш ответ на вопрос