2008-09-24 34 views
16

Tôi có một tập tin XML 2.4 MB, xuất khẩu từ Microsoft Project (hey Tôi là nạn nhân ở đây!) Mà từ đó tôi yêu cầu để trích xuất thông tin chi tiết nhất định để tái trình bày. Bỏ qua thông minh hoặc theo yêu cầu, thư viện nào tôi nên thử trước tiên từ quan điểm của Ruby?Bạn muốn giới thiệu thư viện XML XML nào cho tệp XML 2.4MB?

Tôi biết những điều sau đây (không theo thứ tự đặc biệt):

tôi muốn một cái gì đó đóng gói như một viên ngọc Ruby, mà tôi nghi ngờ thư viện Chilkat thì không.

Hiệu suất không phải là một vấn đề lớn - Tôi không mong đợi điều cần phải chạy nhiều hơn một lần một ngày (mỗi tuần một lần là nhiều khả năng). Tôi quan tâm nhiều hơn đến thứ gì đó dễ sử dụng vì mọi thứ liên quan đến XML đều có thể nhận được.

EDIT: Tôi đã thử các trang được đá quý:

hpricot, theo dặm quốc gia, dễ nhất. Ví dụ, để trích xuất nội dung của thẻ SaveVersion trong XML này (lưu trong một tập tin gọi là, nói 'test.xml')

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Project xmlns="http://schemas.microsoft.com/project"> 
    <SaveVersion>12</SaveVersion> 
</Project> 

mất một cái gì đó như thế này:

doc = Hpricot.XML(open('test.xml')) 
version = (doc/:Project/:SaveVersion).first.inner_html 

Hpricot dường như là tương đối không quan tâm đến không gian tên, mà trong ví dụ này là tốt: chỉ có một, nhưng có khả năng sẽ là một vấn đề với một tài liệu phức tạp. Kể từ khi hpricot cũng rất chậm, tôi thay vì tưởng tượng điều này sẽ là một vấn đề mà giải quyết chính nó.

libxml-ruby là thứ tự cường độ nhanh hơn, hiểu không gian tên (nó đã cho tôi một vài giờ để tìm ra điều này) và hoàn toàn gần gũi hơn với các kim loại XML - truy vấn XPath và tất cả các thứ khác trong đó . Điều này không nhất thiết phải là một điều tốt nếu như tôi, bạn mở một tài liệu XML chỉ trong các điều kiện khắc nghiệt cực đoan. Mô-đun trợ giúp chủ yếu là hữu ích trong việc cung cấp các ví dụ về cách xử lý một không gian tên mặc định một cách hiệu quả. Đây là khoảng những gì tôi đã kết thúc với (tôi không bằng mọi cách khẳng định vẻ đẹp của nó, đúng đắn hoặc giá trị khác, nó chỉ là nơi tôi ngay bây giờ):

xml_parser = XML::Parser.new 
xml_parser.string = File.read(path) 
doc = xml_parser.parse 
@root = doc.root 
@scopes = { :in_node => '', :in_root => '/', :in_doc => '//' } 
@ns_prefix = 'p' 
@ns = "#{@ns_prefix}:#{@root.namespace[0].href}" 
version = @root.find_first(xpath_qry("Project/SaveVersion", :in_root), @ns).content.to_i 

def xpath_qry(tags, scope = :in_node) 
    "#{@scopes[scope]}" + tags.split(/\//).collect{ |tag| "#{@ns_prefix}:#{tag}"}.join('/') 
end 

Tôi vẫn đang tranh luận về ưu và nhược điểm : libxml cho sự khắt khe hơn, hpricot cho phong cách tuyệt đối của mã _why.

CHỈNH SỬA lại, phần nào sau: Tôi đã phát hiện HappyMapper ('gem install happymapper') rất hứa hẹn, nếu vẫn còn ở giai đoạn đầu. Đó là tuyên bố và chủ yếu là công trình, mặc dù tôi đã phát hiện một vài trường hợp cạnh mà tôi chưa có bản sửa lỗi nào được nêu ra. Nó cho phép bạn làm những việc như thế này, phân tích cú pháp của Google Reader của tôi OPML:

module OPML 
    class Outline 
    include HappyMapper 
    tag 'outline' 
    attribute :title, String 
    attribute :text, String 
    attribute :type, String 
    attribute :xmlUrl, String 
    attribute :htmlUrl, String 
    has_many :outlines, Outline 
    end 
end 

xml_string = File.read("google-reader-subscriptions.xml") 

sections = OPML::Outline.parse(xml_string) 

Tôi đã yêu nó, mặc dù nó chưa hoàn hảo.

+1

Oh noes! Tệp XML 2.4 mb! KINH DỊ! – Will

+0

Vâng, tôi nghĩ câu trả lời có thể khác nếu nó là 2.4 GB ...;) –

Trả lời

3

Hpricot có lẽ là công cụ tốt nhất cho bạn - nó rất dễ sử dụng và nên xử lý tệp 2mg không có vấn đề gì.

Speedwise libxml phải là tốt nhất. Tôi sử dụng libxml2 ràng buộc cho python vài tháng trước (tại thời điểm đó rb-libxml đã cũ). Giao diện truyền trực tuyến hoạt động tốt nhất với tôi (LibXML :: XML :: Reader in gem ruby). Nó cho phép xử lý tập tin trong khi nó đang tải xuống, có một chút thân thiện hơn SAX và cho phép tôi tải dữ liệu từ tệp 30ml xml từ internet vào cơ sở dữ liệu MySQL trong ít hơn một phút.

+5

Những ngày này tôi khuyên bạn nên [Nokogiri] (http://nokogiri.org) trên Hpricot. Theo kinh nghiệm của tôi, nó đã được ổn định hơn rất nhiều và rất đầy đủ tính năng và duy trì tốt. –

+1

Vâng tôi đồng ý, Nokogiri là con đường để đi những ngày này – dimus

4

Nokogiri kết thúc tốt đẹp libxml2 và libxslt bằng một API Rubyish sạch, hỗ trợ các không gian tên, truy vấn XPath và CSS3. Nhanh quá. http://nokogiri.org/

+0

Lưu ý, do phụ thuộc cơ bản, nó chỉ hỗ trợ XPATH 1.0 –

Các vấn đề liên quan