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.
Oh noes! Tệp XML 2.4 mb! KINH DỊ! – Will
Vâng, tôi nghĩ câu trả lời có thể khác nếu nó là 2.4 GB ...;) –