Установите атрибут тега и добавьте текстовый контент в тег с помощью 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>