Line | |
---|
1 | require "rexml/document"
|
---|
2 | require "rexml/streamlistener"
|
---|
3 |
|
---|
4 | /\A(\d+)\.(\d+)(?:\.\d+)+\z/ =~ REXML::Version
|
---|
5 | if ([$1.to_i, $2.to_i] <=> [2, 5]) < 0
|
---|
6 | raise LoadError, "needs REXML 2.5 or later (#{REXML::Version})"
|
---|
7 | end
|
---|
8 |
|
---|
9 | module RSS
|
---|
10 |
|
---|
11 | class REXMLParser < BaseParser
|
---|
12 |
|
---|
13 | class << self
|
---|
14 | def listener
|
---|
15 | REXMLListener
|
---|
16 | end
|
---|
17 | end
|
---|
18 |
|
---|
19 | private
|
---|
20 | def _parse
|
---|
21 | begin
|
---|
22 | REXML::Document.parse_stream(@rss, @listener)
|
---|
23 | rescue RuntimeError => e
|
---|
24 | raise NotWellFormedError.new{e.message}
|
---|
25 | rescue REXML::ParseException => e
|
---|
26 | context = e.context
|
---|
27 | line = context[0] if context
|
---|
28 | raise NotWellFormedError.new(line){e.message}
|
---|
29 | end
|
---|
30 | end
|
---|
31 |
|
---|
32 | end
|
---|
33 |
|
---|
34 | class REXMLListener < BaseListener
|
---|
35 |
|
---|
36 | include REXML::StreamListener
|
---|
37 | include ListenerMixin
|
---|
38 |
|
---|
39 | class << self
|
---|
40 | def raise_for_undefined_entity?
|
---|
41 | false
|
---|
42 | end
|
---|
43 | end
|
---|
44 |
|
---|
45 | def xmldecl(version, encoding, standalone)
|
---|
46 | super(version, encoding, standalone == "yes")
|
---|
47 | # Encoding is converted to UTF-8 when REXML parse XML.
|
---|
48 | @encoding = 'UTF-8'
|
---|
49 | end
|
---|
50 |
|
---|
51 | alias_method(:cdata, :text)
|
---|
52 | end
|
---|
53 |
|
---|
54 | end
|
---|
Note:
See
TracBrowser
for help on using the repository browser.