2015-05-18 7 views
9

Ich habe eine Sammlung von XML-Dateien, und einige von ihnen sind ziemlich groß (bis zu ~ 50 Millionen Element-Knoten). Ich benutze xmllint für die Validierung dieser Dateien, die dank der Streaming-API auch für die Großen funktioniert.Wie führe ich XPath-Abfragen in großen XML-Dateien?

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

ich vor kurzem erfahren, dass xmllint Kommandozeile XPath-Abfragen zu tun, auch in der Lage ist, was sehr praktisch ist.

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

Diese XPath-Abfragen funktionieren jedoch nicht für die großen XML-Dateien. Ich erhalte nach einiger Zeit eine Nachricht "Killed". Ich habe versucht, die Streaming-API zu aktivieren, aber das führt nur zu keiner Ausgabe.

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

Gibt es eine Möglichkeit Streaming-Modus zu aktivieren, wenn XPath-Abfragen xmllint mit zu tun? Gibt es andere/bessere Möglichkeiten, Befehlszeilen-XPath-Abfragen für große XML-Dateien auszuführen?

+0

Versuch '--shell' Option für interaktive (nur mit dem XML-Dateipfad) – flafoux

+0

Ich habe versucht, die interaktive Shell für eine große Datei zu öffnen, aber es wird abstürzen („getötet“, so wie in der Fall, dass ich '--stream' nicht benutze, bevor ich irgendeinen Befehl eingeben kann. – MRA

+0

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

Antwort

3

Wenn Ihre XPath-Ausdrücke sehr einfach sind, versuchen Sie xmlcutty.

Von der Homepage:

xmlcutty ist ein einfaches Werkzeug für Elemente aus großen XML-Dateien Carving, schnell. Da es streamingfähig ist, verwendet es fast keinen Speicher und kann etwa 1G XML pro Minute verarbeiten.

+1

Ein Befehl wie 'xmllint --loaddtd --xpath '/ root/a/b/c/text()'/Pfad/zu/small.xml 'würde in' xmlcutty -path'/root/a/b übersetzt werden/c '-rename' \ n '/ path/to/small.xml' - wobei das * rename * das letzte einschließende Element umbenennen soll - und somit ein 'text()' simuliert wird - ist die Syntax etwas geheimnisvoll. – miku

-1

Änderung ulimits könnte funktionieren. Versuchen Sie folgendes:

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