Редактировать очень большие файлы XML - PullRequest
5 голосов
/ 20 мая 2010

Я хотел бы создать текстовое поле, которое загружает XML-файлы и позволяет пользователям редактировать их. Однако я не могу использовать XmlDocument для загрузки, так как файлы могут быть очень большими. Я ищу варианты для потоковой передачи / загрузки XML-документа порциями, чтобы избежать ошибок памяти - в то же время важна производительность. Не могли бы вы дать мне знать, какие будут хорошие варианты?

Ответы [ 8 ]

2 голосов
/ 20 мая 2010

Зачем вообще читать xml в xmldocument, если все, что вы делаете, это помещаете его в текстовое поле?

Какого размера ты говоришь здесь? Вы уже пытались транслировать его в текстовое поле?

sometextarea.Text = System.IO.File.ReadAllText(Server.MapPath("somexml.xml"));

Теперь сохранение его обратно в файловую систему - это отдельная история, особенно если вы хотите, чтобы это было 1. Допустимый xml и 2. Допустимый для схемы.

2 голосов
/ 20 мая 2010

Попробуйте Scintilla.NET, это намного лучше, чем TextBox!

http://scintillanet.codeplex.com/

Загрузка документа проста:

using (TextReader reader = new StreamReader(myFilePath, Encoding.UTF8))
{
    scintillaDocument.Text = reader.ReadToEnd();
}

Или:

scintillaDocument.Text = File.ReadAllText(myFilePath);
1 голос
/ 20 мая 2010

Вы можете использовать сопоставленные с памятью файлы для обработки больших файлов. См. MemoryMappedFile Class в MSDN. ОК, это низкий уровень, но может помочь. Доступно в .NET 4.

Вы можете использовать ридеры с поддержкой XMLNameTable . разрешит интернирование строк , поэтому, если строка часто появляется в документе, эта же строка будет представлять ее в памяти для вас.

Вы также можете попробовать сторонний анализатор XML . Например. Altova XML используется в продуктах компании, поэтому, возможно, он может делать больше, чем встроенные классы .NET. Кстати это бесплатно.

1 голос
/ 20 мая 2010

У меня были проблемы с simimlar, делающие подобные вещи с данными из файла CSV.

DRapp прав, вероятно, это самый чистый способ разрешения ситуации, если пользователь не ожидает, что все прочитает все на уровне root за один удар.

Теоретически, все, что вам нужно, это быть открытым или закрытым, но вы можете хранить только эту базовую информацию в строке, и она не должна быть слишком громоздкой.

и, как предлагает DRapp, вы просто загружаете данные в поток, и при небольшом внимательном управлении положением вы сможете читать и писать.

Ваша самая большая проблема заключается в том, что если, скажем, в точке x вы хотите заменить данные в узле y на некоторые данные другой длины, вы либо в конечном итоге получите пробел в файле, либо перезапишите следующий узел / часть этого.

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

Вы должны иметь возможность делать все это с объектами потокового чтения и записи потоков, которые вы размещаете поверх 1 экземпляра потока в исходном файле, а также потокового редактора во втором временном файле.

Это никогда не будет быстрым, хотя бы потому, что запись обновлений в файл 1.x gig занимает много времени на жестком диске, и никакая оптимизация не изменит этого.

1 голос
/ 20 мая 2010

Мне тоже пришлось иметь дело с большими XML-файлами (1+ гигабайт) и мне пришлось разбирать элементы для импорта в базу данных mySql. Я был успешным, используя текстовый потоковый ридер. Я продолжал читать по частям до тех пор, пока не получу одну полную «запись» xml, основанную на известных

`<perRecordTag>`

   <other data / node elements>

`</perRecordTag>`

Затем я бы сделал XMLDocument для чтения из строки (после начала и конца записи). Затем я мог бы разобрать, просмотреть что-нибудь из этой записи и двигаться дальше.

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

0 голосов
/ 07 сентября 2011

Я не пробовал это с файлами такого большого размера, но вы должны взглянуть на XML Notepad 2007 от Microsoft. Он требует меньше времени загрузки для документа 3 МБ.

http://www.microsoft.com/download/en/details.aspx?id=7973

0 голосов
/ 23 мая 2010

Я думаю, вы пытаетесь сделать слишком много в своем текстовом поле здесь. Почему бы не сделать так, чтобы пользователи редактировали документ XML в инструменте, предназначенном для редактирования XML? Такой инструмент может даже обрабатывать большие XML-файлы.

Затем, когда XML был отредактирован, пользователи могут загрузить полный XML-документ на ваш сайт.

0 голосов
/ 20 мая 2010

Возможно, вы ищете XmlTextReader .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...