0

我正在编写一个简单的 RSS 解析器(我知道已经写了很多),我偶然发现了一个问题。假设我有以下 RSS 提要:

<channel>
  <title>Sunset Boulevard</title>
  <link>http://www.imdb.com/title/tt0043014/</link>
  <description>A hack screenwriter writes a screenplay..</description>
  <language>English</language>
  <item>
    <rating>8.6</rating>
  </item>
</channel>

我有一种方法,可以通过给定的标签和子标签将它们提取到一个简单的哈希中。这是我的“方法”:

def extract_text_from_tag(text, tag)
  text =~ /<#{tag}.*?>(?<tag_text>.*?)<\/#{tag}>/m ? $~[:tag_text] : ''
end

为了解析频道,我首先提取其文本,然后使用一组预定义的标签(标题、链接等)提取它们的数据。但是,我希望我的正则表达式只匹配我的标签的直接子级。

例如在这里,如果我传递“标题”、“链接”、“描述”、“语言”和“评级”标签,我想匹配除“评级”之外的所有标签(因为它是项目的子项)。

4

2 回答 2

1

我从评论中看到,您必须使用正则表达式而不是适当的 XML 解析器来解析这个 RSS 提要。

然而,作为一个反例,下面是使用 Nokogiri 的解决方案:

doc = Nokogiri::XML(rss_xml_string)
doc.xpath('/channel/*').each do |node| # For each child of the root "channel".
  next if node.children.length > 1 # Skip nodes with multiple children.
  puts node.name + ': ' + node.text
end
# title: Sunset Boulevard
# link: http://www.imdb.com/title/tt0043014/
# description: A hack screenwriter writes a screenplay..
# language: English
于 2013-02-14T15:58:30.857 回答
0

需要注意的是,事情可能会变得复杂,超出了正则表达式所能做的范围,这里有一些建议:

假设“<”和“>”在 XML 中被正确转义,而不是.*?你可以使用。[^<>]*?

这将防止在 item 包含子项时提取它的内容,这可能是也可能不是所需的行为(我认为这在您的示例中是可以的,但一般来说可能不行)。

如果您仍然需要提取“项目”的内容(如果有的话),除了可能的子项目,您需要使用条件语句,如果我没记错的话,Ruby 不支持。

您可以将其替换为测试标记是否包含子元素并相应地应用正则表达式的方法,但它确实变得相当复杂。

于 2013-02-14T16:22:08.263 回答