Основная идея - вам нужно найти XML для тегов <book>
. Для каждой найденной книги извлеките блок значений, которые применимы к нему. Найдите тег <author>
и замените его текст. Найдите тег <title>
и замените его текст. Затем перейдите к следующей книге.
Однако, в вашем примере, писать код, чтобы сделать это является излишеством, когда простой gsub
сделает это за один проход:
xml = '<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>AUTHOR1</author>
<title>TITLE1</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
<book id="bk102">
<author>AUTHOR2</author>
<title>TITLE2</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.</description>
</book>
</catalog>
'
values = {
'TITLE1' => 'Moby Dick',
'AUTHOR1' => 'Herman Melville',
'TITLE2' => 'Tom Sawyer',
'AUTHOR2' => 'Mark Twain',
}
puts xml.gsub(Regexp.union(values.keys), values)
# >> <?xml version="1.0"?>
# >> <catalog>
# >> <book id="bk101">
# >> <author>Herman Melville</author>
# >> <title>Moby Dick</title>
# >> <genre>Computer</genre>
# >> <price>44.95</price>
# >> <publish_date>2000-10-01</publish_date>
# >> <description>An in-depth look at creating applications
# >> with XML.</description>
# >> </book>
# >> <book id="bk102">
# >> <author>Mark Twain</author>
# >> <title>Tom Sawyer</title>
# >> <genre>Fantasy</genre>
# >> <price>5.95</price>
# >> <publish_date>2000-12-16</publish_date>
# >> <description>A former architect battles corporate zombies,
# >> an evil sorceress, and her own childhood to become queen
# >> of the world.</description>
# >> </book>
# >> </catalog>
Это использование gsub
часто не используется, но я использовал он много раз заменяет значения в шаблонах. Использование тегов/ключей, которые гарантированно уникальны в документе, очень важны, поэтому я часто отмечаю их с помощью двойных подчеркиваний, ведущих и завершающих. Другими словами __TITLE1__
, __AUTHOR1__
и т.д.
Делая это, вы можете легко заменить содержимое других полей, таких как <genre>
, <price>
и т.д.
Имя переменные в форме такие же, как ключи/теги, и задача становится еще проще, потому что вы должны получить хэш имен полей и значений полей, которые станут источником для вашего хэша, используемого в gsub
.
Обязательно проверьте/дезинфицируйте значения перед заменой. Ошибки пользователей и вредоносные могут сознательно вводить данные, пытаясь сломать ваш код, или, что еще хуже, независимо от того, куда подается XML.
Что делать, если TITLE1 существует в описании? –
Это тег Predefine, поэтому они уникальны. – Sunny
Нам нужно увидеть обобщенный пример кода, демонстрирующий проблему. Нам легче и лучше, если мы исправим ваш код, чем если бы мы напишем что-то совершенно несвязанное, которое не соответствует вашему коду. «Вопросы, требующие помощи по отладке (« почему этот код не работает? ») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения его в самом вопросе. Вопросы без четкого заявления о проблемах не являются полезными другим читателям. См.: [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). " –