REXML:相当于javascript-DOM的.innerHTML =

时间:2011-08-01 20:26:44

标签: ruby xml rexml

有没有办法将字符串传递给REXML::Element,以便将字符串解析为XML,并将找到的元素插入到目标中?

3 个答案:

答案 0 :(得分:2)

您可以扩展REXML :: Element类以包含innerHTML,如下所示。

require "rexml/element"

class REXML::Element
  def innerHTML=(xml)
    require "rexml/document"
    self.to_a.each do |e|
      self.delete e
    end
    d = REXML::Document.new "<root>#{xml}</root>"
    d.root.to_a.each do |e|
      case e
      when REXML::Text
        self.add_text e
      when REXML::Element
        self.add_element e
      else
        puts "ERROR"
      end
    end
    xml
  end
  def innerHTML
    ret = ''
    self.to_a.each do |e|
      ret += e.to_s
    end
    ret
  end
end

然后您可以像在javascript中一样使用innerHTML(或多或少)。

require "rexml/document"
doc = REXML::Document.new "<xml><alice><b>bob</b><chuck>ch<u>u</u>ck</chuck></alice><alice/></xml>" 

c = doc.root.get_elements('//chuck').first
t = c.innerHTML
c.innerHTML = "#{t}<david>#{t}</david>"
c = doc.root.get_elements('//alice').last
c.innerHTML = "<david>#{t}</david>"

doc.write( $stdout, 2 )

答案 1 :(得分:1)

如果您能提供一个示例来进一步说明您的想法,那将会有所帮助。

使用JS innerHTML,您可以一次性插入文本或HTML,并且更改会立即显示在HTML文档中。我知道如何在REXML中执行此操作的唯一方法是使用单独的步骤插入内容/元素并保存/重新加载文档。

要修改特定REXML元素的文本,您可以使用 text =()方法。

#e represents a REXML Element
e.text = "blah"

如果要插入另一个元素,则必须使用 add_element()方法。

#e represents a REXML Element
e.add_element('blah')      #adds <blah></blah> to the existing element
b = e.get_elements('blah') #empty Element named "blah"
b.text('some text')        #add some text to Element blah

然后当然保存带有更改的XML文档。 ruby-doc.org/REXML/Element

答案 2 :(得分:-1)

text()会将内部内容作为字符串

返回