2015-07-01 1 views
0

У меня есть предопределенный XML-шаблон с некоторыми тегами, которые необходимо заменить. Значения тегов динамически выводятся из интерфейса.Как заменить тег на некоторое значение в XML с помощью Nokogiri

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

В приведенном выше примере мне нужно заменить TITLE1, TITLE2, AUTHOR1, AUTHOR2 с фактическим значением динамически.

Каков наилучший способ для этого? Я использую Nokogiri в некотором коде Ruby, но не повезло.

+0

Что делать, если TITLE1 существует в описании? –

+0

Это тег Predefine, поэтому они уникальны. – Sunny

+1

Нам нужно увидеть обобщенный пример кода, демонстрирующий проблему. Нам легче и лучше, если мы исправим ваш код, чем если бы мы напишем что-то совершенно несвязанное, которое не соответствует вашему коду. «Вопросы, требующие помощи по отладке (« почему этот код не работает? ») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения его в самом вопросе. Вопросы без четкого заявления о проблемах не являются полезными другим читателям. См.: [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). " –

ответ

1

Основная идея - вам нужно найти 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.

+0

Спасибо за ответ. Просто нужно знать еще одну вещь, которую я использую, это не строка. Он помещается в файл, и оттуда я читаю XML: - Nokogiri :: XML :: Document.parse (File.open (file_path)) – Sunny

Смежные вопросы