Como remover nós de um arquivo XML HUGE (2gb)?

1

Estou trabalhando com vários arquivos XML enormes (> 2gb) e seu tamanho está causando problemas.

(Meu aplicativo usa XMLReader em um script PHP para analisar arquivos menores de ~ 500mb, e isso funciona bem, mas o XMLReader não abre esses arquivos grandes.)

Então - minha ideia é eliminar os nós principais do arquivo que eu sei que não preciso.

Por exemplo, se a estrutura do arquivo se parece com isso:

<record id="1">
    <a>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </a>
    <b>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </b>
    <c>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </c>
</record>
...
<record id="999999">
    <a>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </a>
    <b>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </b>
    <c>
        <detail>blah</detail>
        ....
        <detail>blah</detail>
    </c>
</record>

Para os meus propósitos - eu só preciso dos dados no nó pai <a> para cada registro . Se eu pudesse eliminar nós pai <b> e <c> de cada registro , eu poderia reduzir substancialmente o tamanho do arquivo, então seria pequeno o suficiente para trabalhar com normalmente.

Qual é a melhor maneira de fazer algo assim?

A maioria dos utilitários "XML-aware" que eu tentei engasgou em um arquivo tão grande, então espero poder fazer isso com algo como sed ou grep .

    
por mattstuehler 18.09.2014 / 19:19

2 respostas

1

Você pode usar o awk:

$cat my.xml | awk '/<b>/{hide=1} /<\/record>/ {hide=0} {if (hide==0) print;}' >mynew.xml

isto ocultará tudo desde a linha que contém <b> e iniciará a exibição com a linha contendo </record>

Por seu comentário, se o seu XML for uma linha grande, basta dividi-lo em linhas e remover caracteres de nova linha depois que você fizer a conversão.

$cat my.xml|sed 's/>/>\n/g'| awk ....... | tr -d '\n' >.....

Jogue fora o xml, comece a usar YAML ou JSON!

    
por 18.09.2014 / 21:14
1

Personnaly, eu faria algo em C (que está no nível mais baixo possível antes da montagem) e faça um loop em todos os nós usando libxml.

Veja alguns exemplos: link

Use o GCC para compilar seu código

Espero que ajude!

    
por 18.09.2014 / 19:23

Tags