仅从日志文件中读取 XML 内容
本文关键字:读取 XML 内容 文件 日志 | 更新日期: 2023-09-27 18:32:16
我有一个日志文件,它以XML格式存储数据。我想读取这些数据,但我遇到的问题是日志文件不是结构良好的XML文件。它包含一些额外的数据,如:
03/22/2013 : 13:23:32 <?xml version="1.0" encoding="UTF-8"?>
<element1>
...
...
...
</element1>
正如您会注意到的 03/22/2013 : 13:23:32 不允许我读取数据并抛出异常说"根级别的数据无效"
我使用以下方法来读取 XML
XmlDocument doc = new XmlDocument();
doc.Load("file.log");
string xmlcontents = doc.InnerXml;
label1.Text = xmlcontents;
请指导我完成解决方案,因为这对我来说很少见。我尝试在谷歌上搜索解决方案,但没有成功谢谢
一个快速的技巧是解析日志文件以仅提取在根 xml 标记之间找到的文本,在您的情况下,
您可以在 ?xml <搜索标签,> 后面的内容是您的根标签,然后继续使用。根据清晰结构的日志文件的可预测性,您可以制定更好的方法来执行此操作,但如果其他方法不起作用,则可以尝试这种方式。
var doc = new XmlDocument();
doc.LoadXml(string.Concat(File.ReadAllLines("file.log").Skip(1)));
重新组织 XML,以便日期成为元素或属性(如果文件太大)
也许您应该将整个文件读取为行数组 ( System.IO.File.ReadAllLines(string path)
),然后连接数组的元素跳过第一行和其余行,这不是 XML 结构的片段(假设您的示例只是输入文件的一部分)。
您可以跳过第一行
var onlyXml = (File.ReadAllLines("file.log")).Skip(1).SelectMany(l => l).ToArray();
var xmlContent = new String(onlyXml);
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlContent);
string xmlcontents = doc.InnerXml;
label1.Text = xmlcontents;
编辑
您只能在第一个"<"和最后一个">"之间获取 xml
var text = File.ReadAllText("file.log");
var beginIndex = text.IndexOf('<');
var endIndex = text.LastIndexOf('>');
var onlyXml = text.Substring(beginIndex, endIndex - beginIndex + 1);