1

我正在尝试使用 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> ... </>] 

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

4

2 回答 2

4

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

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

XPath.each(doc, "*/title/text()") {...
于 2011-11-18T15:07:36.903 回答
3

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

#!/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()文档

text( path = nil ) 一个方便的方法,它返回第一个子文本元素的 String 值,如果存在,则返回 nil。

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

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

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

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

我怀疑很多人真正在寻找的是 DOM 的等价物textContent(或其非法表亲innerText)。以下是你在 Ruby 中的做法:

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

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

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

于 2011-11-17T23:32:54.543 回答