我不知道怎么说这个问题,但我坚持在主循环运行后如何打印文本。我正在使用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
答案 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 }