Mercurial > p > roundup > code
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 |
| 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) |
