C# 在C语言中读取xml文件的节点#

C# 在C语言中读取xml文件的节点#,c#,xml,winforms,datagridview,C#,Xml,Winforms,Datagridview,如何将以下xml文件读入列表: 部分XML文件(data.log) 将子节点读入列表后,我希望返回它并在DataGridView中显示它 非常感谢您对这个问题的任何帮助。您的日志文件不是XML文档。由于XML文档必须有且只有一个,所以它是一系列连接在一起的XML文档。这样的一系列文档可以通过设置来读取。完成此操作后,您可以读取该文件并使用以下命令分别反序列化每个根元素: static List<ApplicationLogEventObject> ReadEvents(string

如何将以下xml文件读入列表:

部分XML文件(data.log)

将子节点读入列表后,我希望返回它并在DataGridView中显示它


非常感谢您对这个问题的任何帮助。

您的日志文件不是XML文档。由于XML文档必须有且只有一个,所以它是一系列连接在一起的XML文档。这样的一系列文档可以通过设置来读取。完成此操作后,您可以读取该文件并使用以下命令分别反序列化每个根元素:

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;            
}
样品

注:

  • 元素值
    10/13/2016 11:15:00 AM
    的XML日期和时间格式不正确,这是错误的。因此,我引入了一个代理
    string DateStampString
    属性来手动处理从所需格式到所需格式的转换,然后将原始
    DateTime
    属性标记为

  • 使用可防止在XML未缩进时读取超过每个根元素末尾的内容

  • 根据for
    XmlTextReader

    从.NET Framework 2.0开始,我们建议您改用System.Xml.XmlReader类

    因此,我建议使用
    XmlReader
    替换该类型

  • 的子节点不是读取它们的合适方法

  • 如果您的日志文件没有在ISO 8601中设置时间格式,您至少应该确保它们的格式是文化上不变的格式,以便可以在具有不同区域设置的计算机之间交换日志文件。使用进行转换可以确保这一点


您的日志文件不是XML文档。由于XML文档必须有且只有一个,所以它是一系列连接在一起的XML文档。这样的一系列文档可以通过设置来读取。完成此操作后,您可以读取该文件并使用以下命令分别反序列化每个根元素:

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;            
}
样品

注:

  • 元素值
    10/13/2016 11:15:00 AM
    的XML日期和时间格式不正确,这是错误的。因此,我引入了一个代理
    string DateStampString
    属性来手动处理从所需格式到所需格式的转换,然后将原始
    DateTime
    属性标记为

  • 使用可防止在XML未缩进时读取超过每个根元素末尾的内容

  • 根据for
    XmlTextReader

    从.NET Framework 2.0开始,我们建议您改用System.Xml.XmlReader类

    因此,我建议使用
    XmlReader
    替换该类型

  • 的子节点不是读取它们的合适方法

  • 如果您的日志文件没有在ISO 8601中设置时间格式,您至少应该确保它们的格式是文化上不变的格式,以便可以在具有不同区域设置的计算机之间交换日志文件。使用进行转换可以确保这一点


看起来不错,有什么问题吗?可能重复:您需要读取片段吗?问题是它没有返回数据,即消息,2016年10月13日上午11:15:00,不适用,发送“所需订单”电子邮件。等等…您正在使用GetAttribute,它将获取属性的值,而不是节点内容的值。(也就是说,看起来不错,问题是什么?可能重复:问题是您需要读取片段吗?问题是它没有返回数据,即消息,2016年10月13日上午11:15:00,不适用,发送“所需订单”电子邮件。等等。您使用的GetAttribute将获取属性值,而不是节点内容的值。(也就是说,非常感谢代码和解释dbc,非常感谢。我只想在本周末或下周初测试代码,如果它回答了我的问题,看看你的代码,它看起来确实应该回答,我肯定会将你的答案标记为我问题的解决方案;-)。非常感谢代码和解释dbc,非常感谢。我只想在本周末或下周初测试代码,如果它回答了我的问题,看看你的代码,我肯定会将你的答案标记为我问题的解决方案;-)。
public class ApplicationLogEventObject
{
    public string EventType { get; set; }
    public DateTime DateStamp { get; set; }
    public string ShortDescription { get; set; }
    public string LongDescription { get; set; }
}
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;            
}
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; }
}