मेरे पास 2.4 एमबी एक्सएमएल फ़ाइल है, जो माइक्रोसॉफ्ट प्रोजेक्ट से निर्यात है (हे, मैं यहां पीड़ित हूं!) जिसमें से मुझे पुन: प्रस्तुति के लिए कुछ विवरण निकालने का अनुरोध किया गया है। खुफिया जानकारी या अन्यथा अनुरोध को अनदेखा करते हुए, मुझे किस पुस्तकालय को रुबी परिप्रेक्ष्य से पहले कोशिश करनी चाहिए?आप कौन सी रूबी एक्सएमएल लाइब्रेरी 2.4 एमबी एक्सएमएल फाइल के लिए सिफारिश करेंगे?
मैं के बारे में पता कर रहा हूँ (किसी विशेष क्रम में) के बाद:
मैं कुछ के रूप में पैक पसंद करते हैं एक रूबी मणि, जिसे मुझे चिल्काट लाइब्रेरी पर संदेह है, वह नहीं है।
प्रदर्शन एक बड़ा मुद्दा नहीं है - मुझे उम्मीद नहीं है कि इस दिन किसी एक दिन में एक से अधिक बार चलाने की आवश्यकता है (सप्ताह में एक बार अधिक होने की संभावना है)। मुझे उस चीज़ में अधिक दिलचस्पी है जो उपयोग करने में आसान है क्योंकि एक्सएमएल से संबंधित कुछ भी प्राप्त करने में सक्षम है।
संपादित करें:
Hpricot एक देश मील द्वारा, है, सबसे आसान: मैं gemified लोगों की कोशिश की। उदाहरण के लिए, इस एक्सएमएल में SaveVersion टैग की सामग्री को निकालने के लिए (नामक एक फ़ाइल में सहेजा कहते हैं, 'test.xml')
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Project xmlns="http://schemas.microsoft.com/project">
<SaveVersion>12</SaveVersion>
</Project>
कुछ इस तरह लेता है:
doc = Hpricot.XML(open('test.xml'))
version = (doc/:Project/:SaveVersion).first.inner_html
Hpricot करने लगता है नामस्थानों के साथ तुलनात्मक रूप से असंभव हो, जो इस उदाहरण में ठीक है: केवल एक ही है, लेकिन संभावित रूप से जटिल दस्तावेज़ के साथ समस्या होगी। चूंकि हैप्रिकॉट भी बहुत धीमा है, इसलिए मुझे लगता है कि यह एक समस्या होगी जो खुद को हल करती है।
libxml-ruby तीव्रता का क्रम है, नामस्थानों को समझता है (यह मुझे समझने के लिए कुछ घंटों का समय लेता है) और एक्सएमएल धातु के बहुत करीब है - XPath प्रश्न और अन्य सभी चीजें वहां हैं । यह जरूरी नहीं है कि, मेरी तरह, आप चरम दुविधा की शर्तों के तहत केवल एक एक्सएमएल दस्तावेज खोलें। सहायक नामस्थान को प्रभावी तरीके से प्रबंधित करने के उदाहरण प्रदान करने में सहायक मॉड्यूल अधिक सहायक था। यह मोटे तौर पर क्या मैं के साथ समाप्त हो गया है (मैं किसी भी तरह से अपनी सुंदरता, शुद्धता या अन्य मूल्य जोर देते हुए में नहीं कर रहा हूँ, यह सिर्फ मैं कहाँ हूँ अभी है):
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
मैं अभी भी पक्ष-विपक्ष पर बहस कर रहा हूँ : _xhy कोड की सरासर शैली के लिए अपने अतिरिक्त कठोरता, hpricot के लिए libxml।
फिर से संपादित करें, कुछ हद तक बाद में: मैंने हैप्पीमैपर ('मणि इंस्टॉल happymapper') की खोज की जो कि अभी भी शुरुआती चरण में बेहद आशाजनक है। यह घोषणात्मक और अधिकतर काम करता है, हालांकि मैंने कुछ किनारे के मामलों को देखा है जिनके पास अभी तक फिक्स नहीं हैं।
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)
मैं पहले से ही इसे प्यार करता हूँ, भले ही यह अभी तक सही नहीं है: यह आप इस तरह सामान, जो मेरे गूगल रीडर OPML पार्स करता है काम करने दिया।
ओह नोस! एक 2.4 एमबी एक्सएमएल फ़ाइल! डर! – Will
खैर, मैंने सोचा कि अगर यह 2.4 जीबी था तो जवाब अलग हो सकता है ...;) –