【问题标题】:Nokogiri tag position before/after content内容之前/之后的 Nokogiri 标签位置
【发布时间】:2013-06-19 13:02:52
【问题描述】:

我想知道是否有可能(当然还有如何)将标签的位置与父标签的内容进行比较。 例如:

Case 1: <a>Hello<br/></a>

Case 2: <a><br/>Hello</a>

这里我想知道 br 是放在“br”标签之前还是之后

编辑: 我真正的目标实际上是转换:

<a>Hello</a>
<a>World!<br/></a>
<a><br/>I</a>
<a>love</a>
<a>Rails.</a>

进入

Hello World!
I love Rails.

但我当前的代码是这样转换的:

Hello World!
I
love Rails

因为我正在寻找每个“a”标签,如果 br 存在我创建一个新行。

【问题讨论】:

  • 你为什么想要一个只包含&lt;br/&gt;的锚?
  • 我尝试用简单的事情来解释我的问题。如果您想要详细信息,我实际上想将我的 xml 文件转换为 txt 文件。每次我有一个 br 我想创建一个新行 exept 如果 br 在我的内容之前。我将编辑我的问题以更清楚地说明这一点。
  • 你能分享你的代码吗?因为您可以简单地将“如果 br 存在”逻辑修改为“如果 br 作为最后一个孩子存在”,那么这就是您想要的。

标签: html ruby-on-rails ruby xml nokogiri


【解决方案1】:

当得到a时尝试使用children。像这样的:

str = '<doc><a>Hello</a>
<a>World!<br/></a>
<a><br/>I</a>
<a>love</a>
<a>Rails.</a></doc>'

doc = Nokogiri::XML.parse(str)
out = ""
doc.css('doc a').each do |block|
  block.children.each do |node|
    if node.element?
      out += "<a></" + node.name + "></a>\n"
    else
      out += "<a>" + node.text + "</a>\n"
    end
  end
end
puts out

输出是:

<a>Hello</a>
<a>World!</a>
<a></br></a>
<a></br></a>
<a>I</a>
<a>love</a>
<a>Rails.</a>

不过,在这种情况下,你应该处理两个 br ......

【讨论】:

  • 泰。它有效,但我是,但我不明白为什么:)。别担心,我想是因为我不知道是什么元素?做呢。我会看看 Nokogiri 文档。
  • Node 的任何 xml 元素都可以是 Node 本身,这有助于将其与节点内的文本区分开来。文档在这里:nokogiri.rubyforge.org/nokogiri/Nokogiri/XML/Node.html
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多