如何使用 Nokogiri 将标签替换为 XML 中的某个值

How to replace tag with some value in XML using Nokogiri

我有一个预定义的 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>

在上面的示例中,我需要将 TITLE1TITLE2AUTHOR1AUTHOR2 动态替换为实际值。

最好的方法是什么?我在一些 Ruby 代码中使用了 Nokogiri,但没有成功。

基本思路是您需要在 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 的这种用法并不经常使用,但我在将值替换到模板中时多次使用它。使用保证在文档中唯一的 tags/keys 是必不可少的,因此我经常使用前导和尾随双下划线标记它们。也就是说__TITLE1____AUTHOR1__

这样你就可以轻松替换其他字段的内容,比如<genre><price>

将表单中的变量命名为与 keys/tags 相同的名称,任务变得更加容易,因为您应该收到字段名称和字段值的散列,这将成为您使用的散列的来源在 gsub

替换前务必 verify/sanitize 值。用户输入错误和恶意用户可以故意输入数据以试图破坏您的代码,或者更糟的是,无论 XML 被输入什么。