REXML: Эквивалент javascript-DOM .innerHTML = - PullRequest
1 голос
/ 02 августа 2011

Есть ли способ передать строку в REXML::Element таким образом, что строка будет проанализирована как XML, а найденные элементы вставлены в цель?

Ответы [ 3 ]

2 голосов
/ 17 сентября 2014

Вы можете расширить класс 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

Затем вы можете использовать innerHTML, как в javascript (более или менее).

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 голос
/ 31 мая 2012

Было бы полезно, если бы вы могли привести пример, чтобы проиллюстрировать, что именно вы имели в виду.

С помощью 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

0 голосов
/ 02 августа 2011

text() вернет внутреннее содержимое в виде строки

...