0

この質問をどのように表現すればよいかわかりませんが、メイン ループの実行後にテキストを出力する方法に行き詰まっています。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>

s が最後に来ることに注意してください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 の最初のブロックの後に hourID 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