summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/lib/libxmllib.tex3
-rw-r--r--Lib/xmllib.py9
2 files changed, 10 insertions, 2 deletions
diff --git a/Doc/lib/libxmllib.tex b/Doc/lib/libxmllib.tex
index d8aa3ed..7a7c85d 100644
--- a/Doc/lib/libxmllib.tex
+++ b/Doc/lib/libxmllib.tex
@@ -27,7 +27,8 @@ Stop processing tags. Treat all following input as literal input
\end{methoddesc}
\begin{methoddesc}{setliteral}{}
-Enter literal mode (CDATA mode).
+Enter literal mode (CDATA mode). This mode is automatically exited
+when the close tag matching the last unclosed open tag is encountered.
\end{methoddesc}
\begin{methoddesc}{feed}{data}
diff --git a/Lib/xmllib.py b/Lib/xmllib.py
index 06dc373..4e62ae5 100644
--- a/Lib/xmllib.py
+++ b/Lib/xmllib.py
@@ -205,7 +205,6 @@ class XMLParser:
if k < 0: break
self.lineno = self.lineno + string.count(rawdata[i:k], '\n')
i = k
- self.literal = 0
continue
if commentopen.match(rawdata, i):
if self.literal:
@@ -503,11 +502,19 @@ class XMLParser:
return -1
res = tagfind.match(rawdata, i+2)
if res is None:
+ if self.literal:
+ self.handle_data(rawdata[i])
+ return i+1
self.syntax_error('no name specified in end tag')
tag = ''
k = i+2
else:
tag = res.group(0)
+ if self.literal:
+ if not self.stack or tag != self.stack[-1]:
+ self.handle_data(rawdata[i])
+ return i+1
+ self.literal = 0
k = res.end(0)
if endbracket.match(rawdata, k) is None:
self.syntax_error('garbage in end tag')