annotate TAL/XMLParser.py @ 1029:c3e391d9c4e9

more FieldStorage fun
author Richard Jones <richard@users.sourceforge.net>
date Tue, 03 Sep 2002 07:42:38 +0000
parents bfd348432420
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
982
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 ##############################################################################
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 #
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # Copyright (c) 2001, 2002 Zope Corporation and Contributors.
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 # All Rights Reserved.
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 #
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 # This software is subject to the provisions of the Zope Public License,
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 # FOR A PARTICULAR PURPOSE
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 #
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 ##############################################################################
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 """
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 Generic expat-based XML parser base class.
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
16 """
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 import zLOG
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 class XMLParser:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 ordered_attributes = 0
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 handler_names = [
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 "StartElementHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 "EndElementHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 "ProcessingInstructionHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 "CharacterDataHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 "UnparsedEntityDeclHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 "NotationDeclHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 "StartNamespaceDeclHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 "EndNamespaceDeclHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 "CommentHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 "StartCdataSectionHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 "EndCdataSectionHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 "DefaultHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 "DefaultHandlerExpand",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 "NotStandaloneHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 "ExternalEntityRefHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 "XmlDeclHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 "StartDoctypeDeclHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 "EndDoctypeDeclHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 "ElementDeclHandler",
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 "AttlistDeclHandler"
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 ]
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 def __init__(self, encoding=None):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 self.parser = p = self.createParser()
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 if self.ordered_attributes:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 try:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 self.parser.ordered_attributes = self.ordered_attributes
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 except AttributeError:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 zLOG.LOG("TAL.XMLParser", zLOG.INFO,
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 "Can't set ordered_attributes")
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 self.ordered_attributes = 0
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 for name in self.handler_names:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 method = getattr(self, name, None)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 if method is not None:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 try:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 setattr(p, name, method)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 except AttributeError:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 zLOG.LOG("TAL.XMLParser", zLOG.PROBLEM,
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 "Can't set expat handler %s" % name)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 def createParser(self, encoding=None):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 global XMLParseError
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 try:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 from Products.ParsedXML.Expat import pyexpat
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 XMLParseError = pyexpat.ExpatError
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 return pyexpat.ParserCreate(encoding, ' ')
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 except ImportError:
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 from xml.parsers import expat
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 XMLParseError = expat.ExpatError
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 return expat.ParserCreate(encoding, ' ')
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 def parseFile(self, filename):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 self.parseStream(open(filename))
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 def parseString(self, s):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 self.parser.Parse(s, 1)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 def parseURL(self, url):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 import urllib
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 self.parseStream(urllib.urlopen(url))
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 def parseStream(self, stream):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 self.parser.ParseFile(stream)
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 def parseFragment(self, s, end=0):
bfd348432420 Adding TAL to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 self.parser.Parse(s, end)

Roundup Issue Tracker: http://roundup-tracker.org/