Легкий синтаксический анализатор XML, эффективный для больших файлов?

Вы также можете использовать chomp (см. в API Dock ), который по умолчанию удаляет символ (ы) разделителя завершающей записи, но также может принимать аргумент и затем удаляет конец строки, только если он соответствует указанному символу (символам).

"hello".chomp            #=> "hello"
"hello\n".chomp          #=> "hello"
"hello\r\n".chomp        #=> "hello"
"hello\n\r".chomp        #=> "hello\n"
"hello\r".chomp          #=> "hello"
"hello \n there".chomp   #=> "hello \n there"
"hello".chomp("llo")     #=> "he"
"hello*".chomp("*")      #=> "hello"

8
задан Alex Jenter 17 June 2009 в 11:53
поделиться

7 ответов

Если вы используете C, вы можете использовать LibXML из проекта Gnome . Вы можете выбирать из интерфейсов DOM и SAX для своего документа, плюс множество дополнительных функций, которые разрабатывались годами. Если вам действительно нужен C ++, вы можете использовать libxml ++ , который представляет собой OO-оболочку C ++ вокруг LibXML.

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

7
ответ дан 5 December 2019 в 08:00
поделиться

Мне нравится ExPat
http://expat.sourceforge.net/

Он основан на C, но есть несколько программных оболочек C ++, которые могут помочь.

6
ответ дан 5 December 2019 в 08:00
поделиться

If your XML structure is very simple you can consider building a simple lexer/scanner based on lex/yacc (flex/bison) . The sources at the W3C may inspire you: http://www.w3.org/XML/9707/parser.y and http://www.w3.org/XML/9707/scanner.l.

See also the SAX2 interface in libxml

1
ответ дан 5 December 2019 в 08:00
поделиться

http://sourceforge.net/projects/wsdlpull это прямой порт c ++ для java xmlpull api ( http://www.xmlpull.org/ )

Я очень рекомендую этот парсер. Мне пришлось настроить его для использования на моем встраиваемом устройстве (без поддержки STL), но я обнаружил, что он очень быстрый с очень небольшими накладными расходами. Мне пришлось создать свои собственные строковые и векторные классы, и даже с ними он компилируется примерно до 60 КБ в Windows.

Я думаю, что анализ методом pull намного более интуитивно понятен, чем что-то вроде SAX. Код гораздо более точно отражает XML-документ, что упрощает корреляцию между ними.

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

2
ответ дан 5 December 2019 в 08:00
поделиться

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

0
ответ дан 5 December 2019 в 08:00
поделиться

firstobject's CMarkup is a C++ class that works as a lightweight huge file pull parser (I recommend a pull parser rather than SAX), and huge XML file writer too. It adds up to about 250kb to your executable. When used in-memory it has 1/3 the footprint of tinyxml by one user's report. When used on a huge file it only holds a small buffer (like 16kb) in memory. CMarkup is currently a commercial product so it is supported, documented, and designed to be easy to add to your project with a single cpp and h file.

The easiest way to try it out is with a script in the free firstobject XML editor such as this:

ParseHugeXmlFile()
{
  CMarkup xml;
  xml.Open( "HugeFile.xml", MDF_READFILE );
  while ( xml.FindElem("//record") )
  {
    // process record...
    str sRecordId = xml.GetAttrib( "id" );
    xml.IntoElem();
    xml.FindElem( "description" );
    str sDescription = xml.GetData();
  }
  xml.Close();
}

From the File menu, select New Program, paste this in and modify it for your elements and attributes, press F9 to run it or F10 to step through it line by line.

1
ответ дан 5 December 2019 в 08:00
поделиться

RapidXML - достаточно быстрый парсер для XML, написанного на C++.

4
ответ дан 5 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

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