繁体   English   中英

使用Ruby和Hpricot将xml转换为yaml-这里出了什么问题?

[英]Converting xml to yaml with Ruby and Hpricot - what's going wrong here?

我正在尝试将XML文件blog.xml输出为yaml,以便放入vision.app中,该工具是用于在本地设计shopify电子商务网站的工具。

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: john@smith.com
          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: john@jones.com
          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” gem,以为我缺少其中的某些方法,但这也无济于事:

我找到了 也许可以帮上忙。 http://brains.parslow.net/node/1623

抱歉,Josh,我想您在这里发现的是纯粹和简单的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支持,蛮力方法(也许是唯一的方法)是在Hpricot的类中添加to_yaml方法,以教他们如何正确输出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面定义添加:见“角度来说,Hpricot /转/ hpricot_scan / hpricot_scan.rl”,在方法Init_hpricot_scan

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM