2015-05-18 14 views
9

XML dosyalarından oluşan bir koleksiyonum var ve bunların bazıları oldukça büyük (~ 50 milyon eleman düğümüne kadar). Aktarım API'sı sayesinde büyük dosyalar için bile oldukça güzel olan bu dosyaları doğrulamak için xmllint kullanıyorum.Büyük XML dosyalarında komut satırı XPath sorguları nasıl yapılır?

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

Geçenlerde xmllint da çok kullanışlı bir komut satırı XPath sorguları, yapma yeteneğine sahip olduğunu öğrendik.

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

Ancak, bu XPath sorguları büyük XML dosyaları için çalışmaz. Bir süre sonra sadece "Killed" mesajı alıyorum. Akış API'sini etkinleştirmeyi denedim, ancak bu sadece hiç çıktı almıyor.

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

xmllint kullanarak XPath sorguları yaparken akış modunu etkinleştirmek için bir yol var mı? Büyük XML dosyaları için komut satırı XPath sorguları yapmak için başka/daha iyi yollar var mı? XPath ifadeleri çok basit ise

+0

deneyin '(sadece xml dosya yolu ile) interaktif için --shell' seçeneği Ben büyük dosya için etkileşimli kabuk açılış çalıştı – flafoux

+0

, ama sadece olduğu gibi ("Öldürülen" kilitlenmesine: Bu deneyin Herhangi bir komutu girmeden önce '--stream' kullanmama durumu. – MRA

+0

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

cevap

3

, xmlcutty deneyin. anasayfasından

:

xmlcutty hızlı, büyük XML dosyalarından unsurları dışarı oyma için basit bir araçtır. Akış halinde çalıştığı için neredeyse hiç bellek kullanmaz ve dakikada 1 G XML işleyebilir.

+1

xmllint --loaddtd --xpath '/ root/a/b/c/text()'/yol/to/small.xml' gibi bir komut, xmlcutty -path '/ root/a/b'ye çevrilecektir./c '-rename' \ n '/ yol/to/small.xml' - * yeniden adlandır * öğesinin son çevreleyen öğeyi yeniden adlandırması ve böylece bir metin()' yi simüle etmesi anlamına gelir - sözdizimi bit yaylıdır. – miku

-1

değişim ulimits işe yarayabilir.

$ ulimit -Sv 500000 
$ xmllint (...your command) 
İlgili konular