如何使用 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>
在上面的示例中,我需要将 TITLE1
、TITLE2
、AUTHOR1
、AUTHOR2
动态替换为实际值。
最好的方法是什么?我在一些 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 被输入什么。
我有一个预定义的 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>
在上面的示例中,我需要将 TITLE1
、TITLE2
、AUTHOR1
、AUTHOR2
动态替换为实际值。
最好的方法是什么?我在一些 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 被输入什么。