0

我不知道如何表达这个问题,但我坚持在主循环运行后如何打印文本。我正在与 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>

请注意hourIDs 是如何结束的但我得到以下信息:

<?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
4

1 回答 1

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 }     
于 2013-07-08T02:38:20.450 回答