2008-09-24 24 views
16

Ben 2.4 MB XML dosyası, ben yeniden sunum için belli ayrıntıları ayıklamak için talep ediyorum hangi Microsoft Project dan bir ihracat (hey Burada kurban benim!) Var. İstihbarat göz ardı edilirse ya da istek başka türlü, ilk olarak bir Ruby perspektifinden hangi kütüphaneyi denemeliyim?Hangi Ruby XML kütüphanesi 2.4 MB XML dosyası için öneriyorsunuz?

Bildiğim kadarıyla (özel bir sırada) Aşağıdaki: Ben olarak paketlenmiş bir şey tercih ediyorum

Chilkat kütüphanesinden şüphelendiğim bir Ruby gem değil.

Performans büyük bir sorun değil - Ben şey bir gün bir kereden fazla çalıştırmak için gereken sanmıyoruz (haftada bir daha olasıdır). XML ile ilgili herhangi bir şey olarak kullanımı kolay olan bir şeyle daha çok ilgileniyorum.

DÜZENLEME:

hpricot, bir ülkenin mil tarafından en kolay: Ben gemified olanları denedik.

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

hpricot görünüyor: Örneğin, bu XML SaveVersion etiketinin içeriğini ayıklamak için

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

böyle bir şey alır (adında bir dosyaya kaydedilir, 'test.xml' demek) Bu örnekte gayet ad, nispeten umursamaz: orada sadece biri, ama potansiyel olarak karmaşık bir belge ile ilgili bir sorun olabilir. Hpricot da çok yavaş olduğu için, bunun kendisini çözen bir problem olacağını düşünmekteyim.

libxml-ruby daha büyük bir mertebeden bir mertebedir, ad alanlarını anlar (bunu anlamak için bana birkaç saat sürdü) ve XML metale çok daha yakındır - XPath sorguları ve tüm diğer şeyler oradadır . Benim gibi bir XML belgesini sadece aşırı zorlama koşulları altında açarsanız, bu iyi bir şey değildir. Yardımcı modül, bir varsayılan ad alanını etkin bir şekilde nasıl işleyeceğine dair örnekler sunmada çoğunlukla yardımcı oldu. Bu (, şu anda sadece Neredeyim ben var ben onun güzelliği, doğruluğu veya başka bir değer iddia herhangi bir şekilde değilim) ben ile sona erdi kabaca ne:

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 

Hala olumlu ve olumsuz yanlarını tartışmaya ediyorum : Ekstra zorluk için libxml, _why'nin şifreli stili için hpricot. Biraz sonra tekrar

DÜZENLEME: Ben erken bir aşamada hala varsa, derece umut verici olan ('taş happymapper install') HappyMapper keşfetti. Deklaratif ve çoğunlukla işe yarıyor, ancak henüz düzeltmelerim olmayan birkaç kenar durum tespit ettim. henüz mükemmel değil rağmen

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) 

Zaten onu seviyorum: Bu benim Google Reader OPML ayrıştırır böyle şeyler, yapalım.

+1

Oh noes! Bir 2.4 mb XML dosyası! KORKU! – Will

+0

Peki, cevabın 2.4 GB olması durumunda farklı olabileceğini düşündüm ...;) –

cevap

3

Hpricot muhtemelen sizin için iyi bir araçtır - kullanımı kolaydır ve hiçbir sorunla 2mg dosyayı işlemek gerekir.

Hızla libxml en iyisi olmalıdır. Birkaç ay önce python için libxml2 bağlamayı kullandım (o anda rb-libxml eskiydi). Akış arayüzü benim için en iyi çalıştı (LibXML :: XML :: Reader ruby ​​gem). Dosya indirilirken, SAX'tan biraz daha kullanıcı dostu olarak işlenmeye izin veriyor ve 30MB xml dosyadan internetten bir dakikadan daha uzun bir sürede MySQL veritabanına veri yüklememe izin verdi.

+5

Bugünlerde Hpricot üzerinden [Nokogiri] (http://nokogiri.org) öneriyorum. Benim deneyimime göre çok daha kararlı ve çok iyi özellikli ve bakımlı. –

+1

Evet, kabul ediyorum, Nokogiri bu günlerde gitmenin yoludur. – dimus

4

Nokogiri, ad alanlarını, XPath ve CSS3 sorgularını destekleyen temiz, Rubyish API'sini libxml2 ve libxslt ile sarar. Hızlı da. http://nokogiri.org/

+0

Not: altta yatan bağımlılıklar nedeniyle, sadece XPATH 1.0'ı destekliyor –