【问题标题】:Ruby REXML: Get Value Of An XML ElementRuby REXML:获取 XML 元素的值
【发布时间】:2011-11-17 23:21:00
【问题描述】:

我正在尝试使用 rexml 将一些 xml 元素的值放入一个数组中。这是我正在做的一个例子:

doc = Document.new("<data><title>This is one title</title><title>This is another title</title></data>")
XPath.each( doc, "*/title") { |element| 
    puts element.text
}

但是,输出:

[<title> ... </>, <title> ... </>] 

如何让它输出一个包含“这是一个标题”和“这是另一个标题”的数组?

【问题讨论】:

  • 虽然puts 可以将其参数转换为字符串,但您可以让XPath 首先返回文本节点:XPath.each(doc, "*/title/text()") {...
  • 就是这样。我不得不在每个内部调用 text() 方法。谢谢!
  • @LarsH:对不起,Lars,我在发布答案后才看到您的评论:(请发布答案,我会删除我的。
  • @Dimitre:好的,会的。我一开始没有发布答案的原因是因为我认为,根据 lwburk 的回答,问题已经解决了。
  • @Jarred,很高兴您的问题得到解决。我将我的评论转换为答案......所以如果你想投票,那就是它。

标签: ruby-on-rails ruby xml xpath rexml


【解决方案1】:

根据请求将我的评论移至答案:

虽然puts 可以将其参数转换为字符串,但您可以让 XPath 首先返回文本节点:

XPath.each(doc, "*/title/text()") {...

【讨论】:

  • 谢谢,@Dimitre。我仍然认为 lwburk 的答案非常好,他做的工作比我做的多:他测试了 OP 的代码,发现行为符合预期,并将结果带回 OP 以检查 OP 是否只是忘记了一些明显的事情.
  • @Dimitre, @LarsH - 这不仅仅是 puts 将其输出转换为字符串,而是 element.text 和首先选择 text() 是等效的(鉴于 OP 的输入)。
  • @lwburk:好的。 Dimitre - 这就是为什么我更喜欢 lwburk 的答案的部分原因......他对 Ruby XPath API 有所了解,而我不知道。 :-)
  • 我仍然想知道 OP 到底是如何通过他展示的代码获得他所获得的输出的。
  • @lwburk,LarsH,好的,lwburk 也是 +1。我主要感兴趣的是如何使用 XPath 可以最大限度地减少对主机 PL 中编程结构的需求。
【解决方案2】:

你确定吗?这是一个完整的程序:

#!/usr/bin/ruby

require 'rexml/document'
include REXML

doc = Document.new("<data><title>This is one title</title><title>This is another title</title></data>")
XPath.each( doc, "*/title") { |element|
    puts element.text
}

输出:

This is one title
This is another title

编辑:听起来 OP 已经继续前进,但我认为这里应该为未来的访问者添加一些说明。我赞成 @LarsH 的好答案,但应该注意的是,鉴于 OP 的特定输入,element.text 应该产生 完全相同的输出,就像首先选择 text() 节点一样.来自the docs

文本(路径 = nil) 返回字符串值的便捷方法 第一个子文本元素的值,如果存在,否则为零。

原始问题中给出的示例输入显示&lt;title&gt; 元素在每种情况下仅包含一个文本节点。因此,这两种方法是相同的(在这种情况下)。

但是,请注意以下重要说明:

请注意,一个元素可能有多个 Text 元素,也许 被其他孩子隔开。请注意,此方法仅返回 第一个文本节点。

您可以使用texts()(复数)获取元素的所有子文本节点。

我怀疑很多人真正在寻找的是 DOM 的 textContent(或其非法表亲 innerText)的等价物。以下是在 Ruby 中您可以如何做到这一点:

XPath.each(doc, "*/title") { |el|
    puts XPath.match(el,'.//text()').join
}

这会将每个元素的所有文本后代连接成一个字符串。

简短的回答是没有简短的答案。您想要其中哪一个(如果有的话)是高度特定于上下文的。原始问题中唯一的要求是“将一些 xml 元素的值放入一个数组中”,这并不是一个真正的规范。

【讨论】:

  • 是的,我确信我在上面发布的输出就是我得到的。是否有任何类型的配置可能导致这种不同的输出?
  • @Jarred,如果仍然重要,您可以发布更多代码,例如您的 require 和 include 语句。但是您可能已经检查过 lwburk 并且它们是相同的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多