最后坚持使用Ruby foreach打印文本

时间:2013-07-08 02:26:00

标签: ruby xml foreach

我不知道怎么说这个问题,但我坚持在主循环运行后如何打印文本。我正在使用builder来生成一些XML。问题是我想打印以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<twenty4threshold xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <servicedef>
    <hostname></hostname>
  </servicedef>
  <servicedef>
    <hostname></hostname>
  </servicedef>
  <hours hoursID="1">
  </hours>
  <hours hoursID="2">
  </hours>
</twenty4threshold>

注意hourID到底是怎么来的但是我得到了以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<twenty4threshold xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <servicedef>
    <hostname></hostname>
  </servicedef>
  <hours hoursID="1">
  </hours>
  <servicedef>
    <hostname></hostname>
  </servicedef>
  <hours hoursID="2">
  </hours>
</twenty4threshold>

这是可以理解的,因为我在foreach循环中打印文本。我不明白的是如何在servicedef的第一个块之后打印hoursID XML语句。我在想一个嵌套的for循环?我也尝试过,没有运气。关于我做错的任何建议都表示赞赏。

这是我的代码:

#!/usr/bin/env ruby

require 'builder'

builder = Builder::XmlMarkup.new(:target=>STDOUT, :indent=>2)
builder.instruct! :xml, :version => '1.0', :encoding => 'UTF-8'
builder.twenty4threshold("xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance") {
  source = File.new "host.txt"
  hid = 0

  source.readlines.each do |access|
    hid = hid += 1;
    builder.servicedef { |b| b.hostname(""); }

    builder.hours(:hoursID => "#{hid}") {  }
  end

1 个答案:

答案 0 :(得分:1)

您正在阅读该文件,并为每一行打印<servicedef><hours>。如果你想写所有<servicedef>标签,然后是所有<hours>标签,我建议你首先加载文件,记住你想要记住的数组,然后循环两次。类似的东西:

lines = source.lines
lines.each do |access|
  builder.servicedef { |b| b.hostname(""); }
end
lines.each do |access|
  hid += 1
  builder.hours(:hoursID => "#{hid}") {  }
end

另请注意,您没有关闭文件。在块中进行文件读取是一个好习惯,因此您的文件将在您需要时自动关闭,而不是在代码终止之前保持句柄处于打开状态:

lines = File.open("host.txt") { |source| source.lines }