1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#! /usr/local/bin/ruby
require 'xmlextparser'
class TestParser < XML::ExtParser
def externalParsedEntityDecl(entname, base, sysid, pubid)
p ["externalParsedEntityDecl", entname, base, sysid, pubid]
end
def internalParsedEntityDecl(entname, text)
p ["internalParsedEntityDecl", entname, text]
end
def escapeAttrVal(str)
ret = ""
str.scan(/./um) do |c|
code = c.unpack("U")[0]
if code == 9 || code == 10 || code == 13
ret << sprintf("&#x%X;", code)
elsif c == "&"
ret << "&"
elsif c == "\""
ret << """
elsif c == "<"
ret << "<"
else
ret << c
end
end
ret
end
def escapeText(str)
ret = ""
str.scan(/./um) do |c|
code = c.unpack("U")[0]
if code == 13
ret << sprintf("&#x%X;", code)
elsif c == "&"
ret << "&"
elsif c == "<"
ret << "<"
elsif c == ">"
ret << ">"
else
ret << c
end
end
ret
end
def startElement(name, attrs)
print "<" + name
attrs.each do |n, v|
print " " + n + "='" + escapeAttrVal(v) + "'"
end
print ">"
end
def endElement(name)
print "</" + name + ">"
end
def character(text)
print escapeText(text)
end
end
p = TestParser.new
pos = ARGV[0].rindex("/")
if pos
p.setBase(ARGV[0][0, pos + 1])
else
p.setBase("")
end
begin
p.parse($<.read)
rescue XML::Parser::Error
p([$!, p.line])
end
|