C# 在C语言中读取xml文件的节点#
如何将以下xml文件读入列表: 部分XML文件(data.log) 将子节点读入列表后,我希望返回它并在DataGridView中显示它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文档必须有且只有一个,所以它是一系列连接在一起的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;
}
样品
注:
元素值
的XML日期和时间格式不正确,这是错误的。因此,我引入了一个代理10/13/2016 11:15:00 AM
属性来手动处理从所需格式到所需格式的转换,然后将原始string DateStampString
属性标记为DateTime
- 使用可防止在XML未缩进时读取超过每个根元素末尾的内容
- 根据for
: 从.NET Framework 2.0开始,我们建议您改用System.Xml.XmlReader类 因此,我建议使用XmlTextReader
替换该类型XmlReader
的子节点不是读取它们的合适方法
- 如果您的日志文件没有在ISO 8601中设置时间格式,您至少应该确保它们的格式是文化上不变的格式,以便可以在具有不同区域设置的计算机之间交换日志文件。使用进行转换可以确保这一点
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;
}
样品
注:
元素值
的XML日期和时间格式不正确,这是错误的。因此,我引入了一个代理10/13/2016 11:15:00 AM
属性来手动处理从所需格式到所需格式的转换,然后将原始string DateStampString
属性标记为DateTime
- 使用可防止在XML未缩进时读取超过每个根元素末尾的内容
- 根据for
: 从.NET Framework 2.0开始,我们建议您改用System.Xml.XmlReader类 因此,我建议使用XmlTextReader
替换该类型XmlReader
的子节点不是读取它们的合适方法
- 如果您的日志文件没有在ISO 8601中设置时间格式,您至少应该确保它们的格式是文化上不变的格式,以便可以在具有不同区域设置的计算机之间交换日志文件。使用进行转换可以确保这一点
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; }
}