【问题标题】:How to replace tag with some value in XML using Nokogiri如何使用 Nokogiri 将标签替换为 XML 中的某个值
【发布时间】:2015-07-03 01:59:00
【问题描述】:

我有一个预定义的 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,但没有运气。

【问题讨论】:

  • 如果描述中存在 TITLE1 怎么办?
  • 这些是预定义标签,因此它们是独一无二的。
  • 我们需要看一个总结的代码示例来演示这个问题。如果我们更正您的代码,这对我们来说更容易,对您也更好,而不是我们编写一些完全不相关但不适合您的代码的东西。 “寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题是没有用的给其他读者。见:How to create a Minimal, Complete, and Verifiable example。”
  • 同意。我很欣赏这个建议,这对我来说是新的学习体验。再次感谢

标签: ruby-on-rails ruby xml nokogiri


【解决方案1】:

基本思想是您需要在 XML 中搜索 &lt;book&gt; 标记。对于找到的每本书,检索适用于它的值块。找到&lt;author&gt; 标签并替换它的文本。找到&lt;title&gt; 标签,并替换它的文本。然后转到下一本书。

但是,在您的示例中,如果一个简单的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__

这样做可以轻松替换其他字段的内容,如&lt;genre&gt;&lt;price&gt;等。

将表单中的变量命名为与键/标签相同的名称,并且任务变得更加容易,因为您应该收到字段名称和字段值的哈希,这将成为您在 @987654332 中使用的哈希的来源@。

请务必在替换之前验证/清理这些值。用户输入错误和恶意用户可以故意输入数据以试图破坏您的代码,或者更糟的是,无论输入的 XML 是什么。

【讨论】:

  • 感谢您的回答。只需要知道我使用的模板不是字符串的另一件事。它被放置在一个文件中,从那里我正在读取 XML :- Nokogiri::XML::Document.parse(File.open(file_path))
猜你喜欢
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多