Высокопроизводительный анализ XML в C ++

Ну, было много вопросов о разборе XML в C ++ и так далее ... Но, вместо общей проблемы, моя очень специфична.

Я прошу очень эффективный анализатор XML для C ++. В частности, у меня есть ОЧЕНЬ ОЧЕНЬ БОЛЬШОЙ XML-файл для анализа. Мое приложение должно открыть этот файл и получить данные. Он также должен вставить новые узлы и снова сохранить окончательный результат в файл.

Для этого я использовал вначале rapidxml, но он требует, чтобы я открыл файл, проанализировал его все (весь контент, потому что у этой библиотеки нет функций для прямого доступа к файлу без предварительной загрузки всего дерева), затем отредактируйте дерево, измените его и сохраните конечное дерево в файле, перезаписав его ... Это потребляет слишком много ресурсов.

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

9 голосов | спросил Andry 12 Jpm1000000pmWed, 12 Jan 2011 23:55:37 +030011 2011, 23:55:37

7 ответов


0

Вам нужен потоковый синтаксический анализатор XML, а не так называемый синтаксический анализатор DOM.

Существует два типа потоковых анализаторов: pull и push. Синтаксический анализатор хорошо подходит для быстрой записи анализаторов XML, которые загружают данные в программную память. Синтаксический анализатор хорош для написания программы для перевода одного документа в другой (это то, что вы пытаетесь выполнить). Поэтому я думаю, что для вашей проблемы лучше всего использовать синтаксический анализатор.

Чтобы использовать push-анализатор, вам нужно написать то, что по сути является обработчиком событий для анализа событий. Под «событием синтаксического анализа» я имею в виду такие события, как «достигнут начальный тег», «достигнут конечный тег», «найден текст», «проанализирован атрибут» и т. Д.

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

Три превосходные библиотеки синтаксического анализатора для C ++ включают в себя Expat , Xerces-C ++ и libxml2 .

ответил Daniel Trebbien 13 Jam1000000amThu, 13 Jan 2011 00:09:38 +030011 2011, 00:09:38
0

Ищите «SAX parser». В основном это токенизаторы, то есть они генерируют тег за тегом без построения дерева.

ответил Eugene Mayevski 'Allied Bits 13 Jam1000000amThu, 13 Jan 2011 00:03:49 +030011 2011, 00:03:49
0

Я убежден, что не существует библиотеки XML, которая позволила бы вам изменить файл без его предварительной загрузки. Это просто невозможно, потому что файлы не работают таким образом: вы не можете вставить (или удалить) в середине файла. Вы можете только перезаписать блок одинакового размера или добавить в конце. Но ваш запрос потребует добавить или удалить в середине файла.

Возможно чтение только частей XML-файла. Но пишу ... никак.

ответил Konrad Rudolph 13 Jam1000000amThu, 13 Jan 2011 00:01:55 +030011 2011, 00:01:55
0

Хорошо, вот один из проторенных дорожек, я смотрел на это, но сам не использовал его, он называется asmxml . Эти парни утверждают, что производительности нет, недостаток, вам нужен ассемблер x86.

ответил Nim 13 Jam1000000amThu, 13 Jan 2011 00:13:05 +030011 2011, 00:13:05
0

Если вы действительно ищете высокопроизводительный анализатор потоков XML , то libhpxml скорее всего, то, что вам нужно.

ответил Rahra 7 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 07 Sep 2011 12:42:17 +0400 2011, 12:42:17
0

Перейдите к библиотекам шаблонов, насколько это возможно, например, Boost :: property_tree или Boost :: XMLParser или POCO :: XML, и Folly содержит XML Parser.

Избегайте старых библиотек C, это все старые проекты кода.

ответил harshaap 5 +03002016-10-05T11:12:51+03:00312016bEurope/MoscowWed, 05 Oct 2016 11:12:51 +0300 2016, 11:12:51
0

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

ответил linrongbin 15 Jam1000000amSun, 15 Jan 2017 10:34:03 +030017 2017, 10:34:03

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132