2009-08-17 5 views
4

xmlファイルblog.xmlをyamlとして出力しようとしています。これは、ローカルにshopify電子商取引サイトを設計するためのツール、vision.appにドロップするためです。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 

しかし、私はこのエラーを受けていますr。

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でこの問題を1月前に公開しました: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

+0

うん、ほとんど: RubyGemsの - 1.3.5 ルビー1.8.6 Hpricot 0.8.1 OS X のRails 2.3。2 –

+0

XML/HTML解析を探している人にとっては、Hpricotは使用されなくなり、defacto-standardは[Nokogiri](http://nokogiri.org)です。 YAMLの解析は、[YAML](http://www.ruby-doc.org/stdlib-2.1.5/libdoc/yaml/rdoc/index.html)クラスを使用してRubyに組み込まれています。 –

答えて

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サポートを取得するには、YAMLを正しく出力する方法を教授するために、to_yamlメソッドをHpricotのクラスに追加することがあります。 "/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 ")を参照してください。これを追加する必要があるクラスは、C側で定義されています。Init_hpricot_scanの "hpricot/ext/hpricot_scan/hpricot_scan.rl"を参照してください。

関連する問題