Отредактируйте очень большие XML-файлы

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

5
задан John Saunders 23 May 2010 в 13:03
поделиться

7 ответов

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

http://scintillanet.codeplex.com/

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

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

Или:

scintillaDocument.Text = File.ReadAllText(myFilePath);
2
ответ дан 14 December 2019 в 19:04
поделиться

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

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

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

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

2
ответ дан 14 December 2019 в 19:04
поделиться

У меня были похожие проблемы при выполнении подобных операций с данными файла CSV.

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

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

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

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

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

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

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

1
ответ дан 14 December 2019 в 19:04
поделиться

Вы, вероятно, ищете XmlTextReader.

-2
ответ дан 14 December 2019 в 19:04
поделиться

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

`<perRecordTag>`

   <other data / node elements>

`</perRecordTag>`

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

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

1
ответ дан 14 December 2019 в 19:04
поделиться

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

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

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

1
ответ дан 14 December 2019 в 19:04
поделиться

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

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

0
ответ дан 14 December 2019 в 19:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: