2009-08-17 89 views
4

我試圖輸出一個xml文件blog.xml作爲yaml,用於放入vision.app,一個用於在本地設計shopify電子商務網站的工具。用Ruby和Hpricot將xml轉換爲yaml - 這裏出了什麼問題?

Shopify的YAML看起來是這樣的:

- id: 2 
    handle: bigcheese-blog 
    title: Bigcheese blog 
    url: /blogs/bigcheese-blog 
    articles: 
    - id: 1 
     title: 'One thing you probably did not know yet...' 
     author: Justin 
     content: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 
     created_at: 2005-04-04 16:00 
     comments: 
     - 
      id: 1 
      author: John Smith 
      email: [email protected] 
      content: Wow...great article man. 
      status: published 
      created_at: 2009-01-01 12:00 
      updated_at: 2009-02-01 12:00 
      url: "" 
     - 
      id: 2 
      author: John Jones 
      email: [email protected] 
      content: I really enjoyed this article. And I love your shop! It's awesome. Shopify rocks! 
      status: published 
      created_at: 2009-03-01 12:00 
      updated_at: 2009-02-01 12:00 
      url: "http://somesite.com/" 
    - id: 2 
     title: Fascinating 
     author: Tobi 
     content: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 
     created_at: 2005-04-06 12:00 
     comments: 
    articles_count: 2 
    comments_enabled?: true 
    comment_post_url: "" 
    comments_count: 2 
    moderated?: true 

然而,樣品myxml看起來是這樣的:

 <article> 
      <author>Rouska Mellor</author> 
      <blog-id type="integer">273932</blog-id> 
      <body>Worn Again are hiring for a new Sales Director. 

     To view the full job description and details of how to apply click &quot;here&quot;:http://antiapathy.org/?page_id=83</body> 
      <body-html>&lt;p&gt;Worn Again are hiring for a new Sales Director.&lt;/p&gt; 
     &lt;p&gt;To view the full job description and details of how to apply click &lt;a href=&quot;http://antiapathy.org/?page_id=83&quot;&gt;here&lt;/a&gt;&lt;/p&gt;</body-html> 
      <created-at type="datetime">2009-07-29T13:58:59+01:00</created-at> 
      <id type="integer">1179072</id> 
      <published-at type="datetime">2009-07-29T13:58:59+01:00</published-at> 
      <title>Worn Again are hiring!</title> 
      <updated-at type="datetime">2009-07-29T13:59:40+01:00</updated-at> 
     </article> 
     <article> 

我天真地認爲從一個序列化數據格式轉換爲另是相當簡單的,我可以乾脆這樣做:

>> require 'hpricot' 
=> true 
>> b = Hpricot.XML(open('blogs.xml')) 
>> puts b.to_yaml 

但我越來越這個錯誤河

NoMethodError: undefined method `yaml_tag_subclasses?' for Hpricot::Doc:Class 
    from /usr/local/lib/ruby/1.8/yaml/tag.rb:69:in `taguri' 
    from /usr/local/lib/ruby/1.8/yaml/rubytypes.rb:16:in `to_yaml' 
    from /usr/local/lib/ruby/1.8/yaml.rb:391:in `call' 
    from /usr/local/lib/ruby/1.8/yaml.rb:391:in `emit' 
    from /usr/local/lib/ruby/1.8/yaml.rb:391:in `quick_emit' 
    from /usr/local/lib/ruby/1.8/yaml/rubytypes.rb:15:in `to_yaml' 
    from /usr/local/lib/ruby/1.8/yaml.rb:117:in `dump' 
    from /usr/local/lib/ruby/1.8/yaml.rb:432:in `y' 
    from (irb):6 
    from :0 
>> 

我怎樣才能得到在這個問題的頂部概述的形式的數據輸出?我嘗試導入'yaml'寶石,認爲我錯過了其中的一些方法,但這並沒有幫助:

+2

epochwolf在一個月前在GitHub上打開此問題:http://github.com/why/hpricot/issues/#issue/16 您的規格是否相同(Hpricot 0.8.1,Rails 2.3.2,Ruby 1.8.6(OSX),RubyGems 1.3.4)? – mcandre 2009-08-17 16:48:17

+0

是啊,差不多: RubyGems的 - 1.3.5 的Ruby 1.8.6 角度來說,Hpricot 0.8.1 OS X 的Rails 2.3。2 – 2009-08-17 21:29:58

+0

正如對任何尋找XML/HTML解析的人來說的一樣,Hpricot不再被使用,事實上的標準是[Nokogiri](http://nokogiri.org)。 YAML解析使用[YAML](http://www.ruby-doc.org/stdlib-2.1.5/libdoc/yaml/rdoc/index.html)類構建到Ruby中。 – 2014-11-27 22:14:04

回答

1

對不起,喬希,我想你在這裏找到的是Hpricot和/或YAML庫的限制,純粹而簡單。

我不確定Hpricot是否曾以這種方式支持YAML。所討論的方法是由YAML庫動態添加到Object類以及其他基本的Ruby類型,但由於某種原因而不會出現在Hpricot :: Doc的定義中,即使Hpricot :: Doc似乎繼承間接來自Object。

我可以說我也轉載了它,所以它不只是你。

您可以非常容易地添加缺少的方法:

class Hpricot::Doc 
    def self.yaml_tag_subclasses? 
    "true" 
    end 
end 
b = Hpricot.XML(open('blogs.xml')) 

,但你會發現,你便更進一步。這裏是我得到的:

--- !ruby/object:Hpricot::Doc 
options: 
    :xml: true 

所以我們沒有像我們應該迭代容器。

此時,爲了使用YAML庫獲得YAML支持,蠻力的方式(可能唯一的方法)是將to_yaml方法添加到Hpricot的類中,以教他們如何正確輸出YAML。看一看「/usr/lib/ruby/1.8/yaml/rubytypes.rb」(在Mac上,它就像「/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib /ruby/1.8/yaml/rubytypes.rb「),以瞭解如何針對每種基本Ruby類型完成的示例。您可能需要添加的類在C端定義:請參閱方法Init_hpricot_scan中的「hpricot/ext/hpricot_scan/hpricot_scan.rl」。