2015-05-18 14 views
9

Tôi có một bộ sưu tập các tệp XML và một số trong số đó là khá lớn (lên đến ~ 50 triệu nút phần tử). Tôi đang sử dụng xmllint để xác thực các tệp đó, hoạt động khá độc đáo ngay cả đối với những tệp lớn nhờ API truyền trực tuyến.Làm cách nào để thực hiện truy vấn XPath dòng lệnh trong các tệp XML khổng lồ?

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

Gần đây tôi đã biết rằng xmllint cũng có khả năng thực hiện truy vấn dòng lệnh XPath, rất tiện dụng.

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

Tuy nhiên, các truy vấn XPath này không hoạt động đối với các tệp XML lớn. Tôi chỉ nhận được thông báo "Đã bị giết" sau một thời gian. Tôi đã cố gắng bật API truyền trực tuyến, nhưng điều này chỉ dẫn đến không có đầu ra nào cả.

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

Có cách nào để bật chế độ phát trực tuyến khi thực hiện truy vấn XPath bằng cách sử dụng xmllint? Có cách nào khác tốt hơn để thực hiện các truy vấn XPath dòng lệnh cho các tệp XML lớn không?

+0

thử '--shell' lựa chọn cho tương tác (chỉ với các đường dẫn tập tin xml) – flafoux

+0

Tôi cố gắng mở vỏ tương tác cho một tập tin rất lớn, nhưng nó sẽ sụp đổ ("Giết", cũng giống như trong trường hợp không sử dụng '--stream') trước khi tôi có thể nhập bất kỳ lệnh nào. – MRA

+0

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

Trả lời

3

Nếu biểu thức XPath của bạn rất đơn giản, hãy thử xmlcutty.

Từ trang chủ:

xmlcutty là một công cụ đơn giản để khắc ra các yếu tố từ các tập tin XML lớn, nhanh chóng. Kể từ khi nó hoạt động trong một thời trang trực tuyến, nó sử dụng gần như không có bộ nhớ và có thể xử lý khoảng 1G XML mỗi phút.

+1

Lệnh như 'xmllint --loaddtd --xpath '/ root/a/b/c/text()'/path/to/small.xml' sẽ được dịch thành' xmlcutty -path '/ root/a/b/c '-rename' \ n '/ path/to/small.xml' - trong đó * rename * có nghĩa là đổi tên thành phần tử kèm theo cuối cùng - và do đó mô phỏng một 'text()' - cú pháp là bit phức tạp. – miku

-1

thay đổi ulimits có thể hoạt động. Hãy thử điều này:

$ ulimit -Sv 500000 
$ xmllint (...your command) 
Các vấn đề liên quan