Высокопроизводительный анализ XML в C ++ - PullRequest
9 голосов
/ 12 января 2011

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

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

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

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

Ответы [ 8 ]

10 голосов
/ 13 января 2011

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

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

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

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

5 голосов
/ 13 января 2011

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

3 голосов
/ 13 января 2011

SAX-парсеры работают быстрее, чем DOM-парсеры, потому что DOM-парсеры считывают весь файл в память перед построением представления XML-документа в памяти, тогда как SAX-анализатор ведет себя как прослушиватель событий и создает документ так, как он читает в файле., Иди сюда для объяснения.

Как ты упоминал Xerces - хороший синтаксический анализатор C ++ SAX.

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

2 голосов
/ 13 января 2011

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

2 голосов
/ 13 января 2011

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

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

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

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

0 голосов
/ 15 января 2017

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

0 голосов
/ 05 октября 2016

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

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

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