用Nokogiri和Ruby命名元素"text"

Jef*_*eff 5 ruby nokogiri

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

我想将其中一个元素称为"文本"(请参阅​​下面粘贴代码的最底部).通常,为了创建一个新元素,我会做类似下面的事情xml.text- 但它似乎.text是Nokogiri已经用来做其他事情的方法.因此,当我写这一行时,xml.textNokogiri并没有创建一个名为的新元素,<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
       }
     }
  }
Run Code Online (Sandbox Code Playgroud)

Chr*_*erg 11

来自文档:

构建器通过利用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"
Run Code Online (Sandbox Code Playgroud)