Установите атрибут тега и добавьте текстовый контент в тег с помощью nokogiri builder (ruby)

Я пытаюсь создать XML с помощью Nokogiri с некоторыми тегами, которые имеют как атрибуты, так и обычный текст внутри тега. Поэтому я пытаюсь это сделать:

<?xml version="1.0"?>
<Transaction requestName="OrderRequest">
  <Option b="hive">hello</Option>
</Transaction>

С помощью builder у меня есть это:

builder = Nokogiri::XML::Builder.new { |xml|
  xml.Transaction("requestName" => "OrderRequest") do
    xml.Option("b" => "hive").text("hello")
  end
}

который отображает:

<Transaction requestName="OrderRequest">
  <Option b="hive" class="text">hello</Option>
</Transaction>

Таким образом, он производит <Option b="hive" class="text">hello</Option> где я просто хотел бы, чтобы это было <Option b="hive">hello</Option>

Я не уверен, как это сделать. Если я попытаюсь получить объект Nokogiri, просто подав ему XML, который я хочу, он возвращает именно то, что мне нужно, когда внутренний текст находится в теге <Option>, установленном на children=[#<Nokogiri::XML::Text:0x80b9e3dc "hello">], и я не знаю, как установить этот от строителя.

Если у кого-то есть ссылка на это в документации Nokogiri, я был бы признателен.

Ответ 1

Существует два подхода, которые вы можете использовать.

Использование .text

Вы можете вызвать метод .text, чтобы установить текст node:

builder = Nokogiri::XML::Builder.new { |xml|
  xml.Transaction("requestName" => "OrderRequest") do
    xml.Option("b" => "hive"){ xml.text("hello") }
  end
}

который производит:

<?xml version="1.0"?>
<Transaction requestName="OrderRequest">
  <Option b="hive">hello</Option>
</Transaction>

Решение с использованием текстового параметра

В качестве альтернативы вы можете передать текст в качестве параметра. Текст должен быть передан перед значениями атрибута. Другими словами, тег добавляется в форму:

tag "text", :attribute => 'value'

В этом случае желаемым конструктором будет:

builder = Nokogiri::XML::Builder.new { |xml|
  xml.Transaction("requestName" => "OrderRequest") do
    xml.Option("hello", "b" => "hive")
  end
}

Производит тот же XML:

<?xml version="1.0"?>
<Transaction requestName="OrderRequest">
  <Option b="hive">hello</Option>
</Transaction>