2013-09-20 4 views
-1

У меня есть файл журнала, который хранит данные в формате XML. Я хочу прочитать эти данные, но проблема, которую я получаю, заключается в том, что файл журнала не является хорошо структурированным 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; 

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

+0

Я не думаю, что вы можете распознать его как xml. Возможно, вам нужно попытаться временно изменить его расширение на .txt и просто проанализировать его. –

ответ

1

Быстрый хак будет разобрать файл журнала, чтобы извлечь только найденный текст между тегами корневого XML, в вашем случае, то, что находится между < element1> и </element1>.

Вы можете найти тег <? Xml, а что происходит после?> - это ваш корневой тег, и идите с этим. В зависимости от того, насколько предсказуем четко структурированный файл журнала, вы можете сформулировать лучшие способы сделать это, но если ничего не работает, вы можете попробовать это.

0
var doc = new XmlDocument(); 
doc.LoadXml(string.Concat(File.ReadAllLines("file.log").Skip(1))); 

реорганизовать свой XML, так что дата стала элементом или атрибутом, если файл слишком велик

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; 

EDIT

Вы можете получить только xml между первым '<' и последним '>'

var text = File.ReadAllText("file.log"); 
var beginIndex = text.IndexOf('<'); 
var endIndex = text.LastIndexOf('>'); 
var onlyXml = text.Substring(beginIndex, endIndex - beginIndex + 1); 
+0

В чем смысл '.SelectMany (l => l)'? –

+1

Чтобы преобразовать Перечислимый в один Перечислимый cosset

+0

Структура файла такова, что я не могу пропустить строку 1. Кроме того, у меня есть несколько таких записей в файле. см. Редактировать –

0

Возможно, вы должны прочитать весь файл в массиве строк (System.IO.File.ReadAllLines(string path)), а затем присоединиться к элементам массива, пропустив первую строку и остальные строки, которые не являются фрагментами структуры XML (если ваш образец является только частью входного файла).

Смежные вопросы