我有一个日志文件,以XML格式存储数据。我想读取这些数据,但我得到的问题是日志文件不是结构良好的XML文件。它包含一些其他数据,如:
03/22/2013 : 13:23:32 <?xml version="1.0" encoding="UTF-8"?>
<element1>
...
...
...
</element1>
正如您将注意到2013年3月22日:13:23:32不允许我读取数据并抛出异常说“根级别的数据无效”
我使用以下方法来读取XML
XmlDocument doc = new XmlDocument();
doc.Load("file.log");
string xmlcontents = doc.InnerXml;
label1.Text = xmlcontents;
请指导我完成解决方案,因为这对我来说是一个罕见的案例。我尝试使用谷歌搜索解决方案,但无法成功 感谢
答案 0 :(得分:1)
快速破解就是解析日志文件,只提取在根xml标记之间找到的文本,在你的情况下,在&lt;元素1&GT;和&lt; /元素1&GT;
您可以搜索标签&lt; ?xml,后面会发生什么?&gt;是你的根标签,然后继续。根据日志文件结构清晰的可预测性,您可以制定更好的方法,但如果没有其他方法可行,您可以尝试这种方式。
答案 1 :(得分:0)
var doc = new XmlDocument();
doc.LoadXml(string.Concat(File.ReadAllLines("file.log").Skip(1)));
重新组织您的XML,因此如果文件太大,则日期将变为元素或属性
答案 2 :(得分:0)
您可以跳过第一行
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;
修改
你可以在第一个'&lt;'之间只获得xml最后'&gt;'
var text = File.ReadAllText("file.log");
var beginIndex = text.IndexOf('<');
var endIndex = text.LastIndexOf('>');
var onlyXml = text.Substring(beginIndex, endIndex - beginIndex + 1);
答案 3 :(得分:0)
也许您应该将整个文件读取到行数组(System.IO.File.ReadAllLines(string path)
),然后连接跳过第一行和其余行的数组的元素,这些行不是XML结构的片段(假设您的样本只是输入文件的一部分) )。