命名元素" text"与Nokogiri和Ruby

时间:2012-11-23 14:06:54

标签: ruby nokogiri

尝试使用Nokogiri构建XML文档时遇到一个小问题。

我想调用我的一个元素“text”(请参阅​​下面粘贴代码的最底部)。通常,要创建一个新元素,我会执行类似下面的xml.text - 但似乎.text是Nokogiri已经用来做其他事情的方法。因此,当我写这一行xml.text时,Nokogiri并没有创建一个名为<text>的新元素,而只是将文本写成元素的内容。我怎样才能让Nokogiri真正制作一个名为<text>的元素?

builder = Nokogiri::XML::Builder.new do |xml|   
  xml.TEI("xmlns" => "http://www.tei-c.org/ns/1.0"){
    xml.teiHeader {
        xml.fileDesc{
            xml.titleStmt{
                xml.title "Version Log for #{title}"
                xml.author "Jeffrey C. Witt"
            }
            xml.editionStmt{
                xml.edition('n' => "#{ed_no}") {
                    xml.date('when' => "#{newDate}")
                    }
                }
            xml.publicationStmt{
                xml.publisher "#{publisher}"
                xml.pubPlace "#{pubPlace}"
                xml.availability("status" => "free") {
                    xml.p "Published under a Creative Commons Attribution ShareAlike 3.0 License"
                }
                xml.date("when" => "#{newDate}") 
            }   
            xml.sourceDesc {
                xml.p "born digital"
            }
        }
    }
    xml.text "test"{
      xml.body {
       xml.p "test document
       }
     }
  }

1 个答案:

答案 0 :(得分:11)

来自docs

  

构建器通过利用method_missing来工作。不幸的是,一些方法在红宝石中定义,难以去除或有危险。例如,您可能想要创建名称为“type”,“class”和“id”的标签。在这种情况下,您可以使用下划线来消除方法调用中的标记名称。

所以,你所要做的就是在text之后添加一个下划线,如下所示:

builder = Nokogiri::XML::Builder.new { |xml| xml.text_ "test" }
builder.to_xml
#=> "<?xml version=\"1.0\"?>\n<text>test</text>\n"