2015-05-18 11 views
9

Ho una raccolta di file XML e alcuni di essi sono piuttosto grandi (fino a ~ 50 milioni di nodi di elementi). Sto usando xmllint per la convalida di quei file, che funziona abbastanza bene anche per quelli enormi grazie all'API di streaming.Come eseguire query XPath da riga di comando in enormi file XML?

xmllint --loaddtd --stream --valid /path/to/huge.xml 

ho recentemente appreso che xmllint è anche in grado di fare query XPath linea di comando, che è molto utile.

xmllint --loaddtd --xpath '/root/a/b/c/text()' /path/to/small.xml 

Tuttavia, queste query XPath non funzionano per gli enormi file XML. Ho appena ricevuto un messaggio "Ucciso" dopo un po 'di tempo. Ho provato ad abilitare l'API di streaming, ma questo non porta a nessun output.

xmllint --loaddtd --stream --xpath '/root/a/b/c/text()' /path/to/huge.xml 

Esiste un modo per abilitare la modalità di streaming quando si fa query XPath utilizzando xmllint? Esistono altri modi migliori per eseguire query XPath a riga di comando per enormi file XML?

+0

prova '--shell' opzione per l'interattivo (con solo il percorso del file XML) – flafoux

+0

ho provato ad aprire la shell interattiva per un file enorme, ma andrà in crash ("Ucciso", proprio come in il caso di non usare '--stream') prima di poter inserire qualsiasi comando. – MRA

+0

http://superuser.com/questions/543881/efficiently-extracting-a-few-data-from-a-large-xml-file –

risposta

3

Se le espressioni XPath sono molto semplici, provare a xmlcutty.

Dalla homepage:

xmlcutty è un semplice strumento per ritagliarsi elementi dai grandi file XML, veloce. Poiché funziona in streaming, non utilizza quasi memoria e può elaborare circa 1 G di XML al minuto.

+1

Un comando come 'xmllint --loaddtd --xpath '/ root/a/b/c/text()'/path/to/small.xml' verrebbe tradotto in' xmlcutty -path '/ root/a/b/c '-rename' \ n '/ path/to/small.xml' - dove il * rename * è pensato per rinominare l'ultimo elemento che racchiude - e quindi simulare un 'text()' - la sintassi è un po' arcano. – miku

-1

modifica ulimits potrebbe funzionare. Prova questo:

$ ulimit -Sv 500000 
$ xmllint (...your command) 
Problemi correlati