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

发布于 2024-11-27 12:20:30 字数 81 浏览 1 评论 0原文

有没有一种方法可以将字符串传递给 REXML::Element ,从而将字符串解析为 XML,并将找到的元素插入到目标中?

Is there a way to pass a string to an REXML::Element in such a way that the string will be parsed as XML, and the elements so found inserted into the target?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

总攻大人 2024-12-04 12:20:30

您可以扩展 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 )

You can extend the REXML::Element class to include innerHTML as shown below.

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

You can then use innerHTML as you would in javascript (more or less).

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 )
£烟消云散 2024-12-04 12:20:30

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

使用 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

It would help if you could provide an example to further illustrate exactly what you had in mind.

With JS innerHTML you can insert text or HTML in one shot and changes are immediately displayed in the HTML document. The only way I know how to do this in REXML is with separate steps for inserting content/elements and saving/reloading the document.

To modify the text of a specific REXML Elemement you can use the text=() method.

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

If you want to insert another element you have to use the add_element() method.

#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

Then of course save the XML document with the changes. ruby-doc.org/REXML/Element

柠檬色的秋千 2024-12-04 12:20:30

text() 将以字符串形式返回内部内容

text() will return the inner content as a string

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文