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.
Oh noes! Bir 2.4 mb XML dosyası! KORKU! – Will
Peki, cevabın 2.4 GB olması durumunda farklı olabileceğini düşündüm ...;) –