Pergunta

Eu preciso analisar arquivos XML enormes, potencialmente, então eu acho Isto exclui analisadores DOM.

Há qualquer bom analisador SAX leve para C ++, comparável com TinyXML na pegada? A estrutura do XML é muito simples, há coisas avançadas como namespaces e DTDs são necessários. Apenas elementos, atributos e cdata.

Eu sei sobre Xerces, mas seu tamanho de mais de 50mb me dá arrepios.

Obrigado!

Foi útil?

Solução

Se você estiver usando C, então você pode usar LibXML do Gnome projeto. Você pode escolher entre interfaces DOM e SAX para seu documento, além de muitos recursos adicionais que foram desenvolvidos ao longo de anos. Se você realmente quer C ++, então você pode usar libxml ++ , que é um C ++ invólucro OO torno LibXML.

A biblioteca foi provado uma e outra vez, é alto desempenho e pode ser compilado em praticamente qualquer plataforma que você pode encontrar.

Outras dicas

Eu gosto ExPat
http://expat.sourceforge.net/

É C base, mas existem vários invólucros de C ++ para ajudar.

RapidXML é bastante um analisador rápido para XML escrito em C ++.

http://sourceforge.net/projects/wsdlpull este é uma sequência C ++ porta do java xmlpull api ( http://www.xmlpull.org/ )

Eu recomendo este analisador. Eu tive que personalizá-lo para uso no meu dispositivo embutido (sem suporte STL), mas eu encontrei-o para ser muito rápido com muito pouca sobrecarga. Eu tive que fazer minhas próprias classes string e vector, e até mesmo com os que compila para cerca de 60k em janelas.

Eu acho que puxar a análise é muito mais intuitivo do que algo como SAX. O código de espelhos muito mais de perto o documento XML, tornando mais fácil para correlacionar os dois.

A única desvantagem é que é apenas para a frente, o que significa que você precisa para analisar os elementos como eles vêm. Temos um design bastante confuso para a leitura de nossos arquivos de configuração, e eu preciso para analisar uma subárvore inteira, fazer algumas verificações, em seguida, definir alguns padrões em seguida, analisar novamente. Com este analisador a única forma real de lidar com algo parecido é fazer uma cópia do estado, parse com que, em seguida, continuar com o original. Ele ainda acaba sendo uma grande vitória em termos de recursos contra nosso analisador DOM de idade.

Se a sua estrutura XML é muito simples você pode considerar a construção de um simples lexer / scanner com base na lex / yacc (flex / bison). As fontes do W3C pode inspirá-lo: http://www.w3.org/XML /9707/parser.y e http://www.w3.org /XML/9707/scanner.l .

Veja também SAX2 interface no libxml

firstobject do CMarkup é uma classe C ++ que funciona como um enorme analisador de arquivo puxão leve (I recomendar um analisador pull ao invés de SAX), e escritor de arquivo enorme XML também. Acrescenta-se a cerca de 250kb para o seu executável. Quando usado em memória tem 1/3 a pegada de TinyXML pelo relatório de um usuário. Quando usado em um arquivo enorme que só tem um pequeno tampão (como 16kb) na memória. CMarkup é atualmente um produto comercial, de modo que é suportado, documentado e projetado para ser fácil de adicionar ao seu projeto com um único arquivo cpp e h.

A maneira mais fácil de experimentá-lo é com um script no editor de XML firstobject livre como este:

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();
}

A partir do menu Arquivo, selecione Novo Programa, cole este e modificá-lo para os seus elementos e atributos, pressione F9 para executá-lo ou F10 para percorrer linha por linha.

Você pode tentar https://github.com/thinlizzy/die-xml . parece ser muito pequeno e fácil de usar

este é um C ++ 0x XML SAX analisador de código aberto recentemente fez eo autor está disposto feedbacks

ele analisa um fluxo de entrada e gera eventos do callbacks compatíveis para std :: function

a máquina de pilha usa autômatos finitos como um backend e alguns eventos (tag de início e nós de texto) de uso iterators a fim de minimizar o buffer, tornando-o muito leve

Eu olhava para ferramentas que gerar um analisador específicos do esquema DTD / se você quiser pequeno e velozes. Estes são muito bons para documentos grandes.

Eu recomendo pugixml

pugixml é uma biblioteca de processamento de XML C ++ leve.

"pugixml é uma biblioteca de C ++ processamento de XML, que consiste em uma interface DOM-like com recursos de passagem / modificação ricos, um analisador XML extremamente rápido que constrói a árvore DOM de um arquivo XML / tampão, e um XPath 1.0 implementação para consultas de árvores baseadas em dados complexos. suporte completo Unicode também está disponível, com interface de Unicode variantes e conversões entre diferentes codificações Unicode ".

Eu testei alguns analisadores XML, incluindo alguns dos mais caros antes de escolher e usar pugixml em um produto comercial.

pugixml não foi apenas o analisador mais rápido, mas também o mais maduro e API amigável. Eu recomendo. É produto muito estável! Eu comecei a usá-lo desde a versão 0.8. Agora é 1.7.

O grande bônus neste analisador é XPath 1.0 implementação! Para qualquer árvore mais complexa consulta o XPath é um Deus recurso enviada com sucesso!

DOM-como interface com recursos ricos travessia / modificação é extremamente útil para enfrentar uma vida real "pesados" arquivos XML.

É pequeno analisador, rápido. É boa escolha mesmo para iOS ou Android app se você não se importa que liga código C ++.

Benchmarks pode dizer muito. Veja: http://pugixml.org/benchmark.html

Alguns exemplos para (x 86):

pugixml is more than 38 times faster than TinyXML

                    4.1 times faster than CMarkup,

                    2.7 times faster than expat or libxml

Para (x64) pugixml é o analisador mais rápido que eu sei.

Verifique também o uso da memória pelo seu parser XML. Alguns analisadores apenas devorar memória preciosa!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top