【问题标题】:How do I get the sum of all content when parsing an XML tag in Ruby?在 Ruby 中解析 XML 标记时如何获取所有内容的总和?
【发布时间】:2009-06-04 15:17:32
【问题描述】:

我有一些这样的 XHTML(但实际上任何 XML 都可以):

<h1>
  Hello<span class='punctuation'>,</span>
  <span class='noun'>World<span class='punctuation'>!</span>
</h1>

如何在 Ruby 中将 &lt;h1/&gt; 的全部内容作为字符串获取?如:

assert_equal "Hello, World!", h1_node.some_method_that_aggregates_all_content

是否有任何 XML 框架(Nokogirilibxml-ruby 等)内置了这种东西?如果不是,我觉得 Y-Combinator 可能是适合这项工作的工具,但我不太清楚它会是什么样子。

【问题讨论】:

    标签: xml ruby parsing combinators


    【解决方案1】:

    使用 Nokogiri,您只需请求节点的text。我在这样做时看到的问题是该节点中的所有空格和换行符都将被返回,因此您可能希望将它们删除(可能比我为这个示例所做的更好的方法)。

    这是一个示例:

    def test_nokogiri_text
      value = Nokogiri::HTML.parse(<<-HTML_END)
        "<h1>
          Hello<span class='punctuation'>,</span>
          <span class='noun'>World<span class='punctuation'>!</span>
         </h1>"
      HTML_END
    
      h1_node = value.search("h1").first
      assert_equal("Hello, World!", h1_node.text.split(/\s+/).join(' ').strip)
    end
    

    【讨论】:

    • 如果我要将所有换行符都转换为空格(这完全没问题,因为 XML 将它们视为等效),然后 h1_note.text.gsub(/\s+/, ' ' ).strip 的工作原理相同,但速度更快一些,因为它不需要创建尽可能多的新对象。
    【解决方案2】:

    Nokogiri 的Nokogiri::XML::Node#content 会做到的:

    irb(main):020:0> node
    => <h1>
      Hello<span class="punctuation">,</span>
      <span class="noun">World<span class="punctuation">!</span>
    </span>
    </h1>
    irb(main):021:0> node.content
    => "\n  Hello,\n  World!\n\n"
    

    【讨论】:

    • #text 和 #content 是相同的,所以 Aaron 得到了“答案”b/c,他还处理了空白。 +1,虽然:)
    • 另外,他首先发布了他的答案。
    猜你喜欢
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多