2015-11-11 29 views
6

Il comandoxmlstarlet sel su file di grandi dimensioni

$ xmlstarlet sel -t -c "/collection/record" file.xml 

sembra per caricare l'intero file in memoria, prima di applicare la data espressione XPath. Questo non è utilizzabile per file XML di grandi dimensioni.

xmlstarlet fornisce una modalità di streaming per estrarre i sottoelementi da un grande file XML (100G +)?

+0

si potrebbe anche prendere in considerazione un sistema di database come XBase o esistenti che offrono XQuery (un superset di XPath) sui dati XML. –

+0

@ MartininHonnen Grazie, sono un po 'titubante nell'introdurre un componente aggiuntivo. Alla fine ho solo bisogno di selezionare parti di un file XML per l'elaborazione successiva, senza query avanzate. – miku

+1

L'utilizzo del database xml sarebbe interessante se si eseguono ripetutamente le stesse operazioni e spesso. Il database XML ti farebbe risparmiare tempo per analizzare e cercare in un albero analizzato in xml: l'analisi sarebbe fatta solo una volta che si rovina l'importazione e si possono definire indici aggiuntivi. Detto questo, non è facile o immediato selezionare o modificare tale database poiché xml non è stato progettato per scopi di database. – marbu

risposta

6

Xmlstarlet converte tutte (o la maggior parte) operazioni in trasformazioni xslt, quindi la risposta breve è no.

Si potrebbe provare a utilizzare stx, che è il linguaggio di trasformazione streaming simile a xslt. D'altra parte, basta codificare qualcosa insieme in python usando sax o iterparse può essere più facile e veloce (tempo necessario per creare codice) se non ti interessa molto xml.

+0

Grazie, ho pensato di sì e ho anche pensato di scrivere un piccolo strumento - speravo solo che ci fosse qualche strumento, mi mancava. – miku

+1

Penso che la mancanza di strumenti generici di streaming xml (è solo una mia ipotesi personale) è causata dal numero di funzioni e standard xml. Il set completo di funzionalità della maggior parte degli standard xml non è possibile implementarlo in modo amichevole. – marbu

+0

Sì, probabilmente. Ma anche per compiti più leggeri come la divisione XML ci sono solo pochi strumenti relativamente sconosciuti, come "xml_split". È un po 'deprimente. – miku

8

Poiché avevo solo bisogno di un piccolo sottoinsieme di XPath per file XML di grandi dimensioni, ho implementato personalmente un piccolo strumento: xmlcutty.

L'esempio da mia domanda potrebbe essere scritto in questo modo:

$ xmlcutty -path /collection/record file.xml 
Problemi correlati