[xml] sax and entities

From: Petr Pajas <pajas ufal mff cuni cz>

To: xml gnome org

Subject: [xml] sax and entities

Date: Sun, 10 Jun 2007 23:10:31 +0200

Hi,
I have two files (also attached)
1) test.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE a [
<!ENTITY b SYSTEM "b.txt">
]>
<a>&b;</a>
2) b.txt, which contains just "B"
When parsing test.xml via the SAX2 interface, I get two character callbacks
for the string "B". The problem can be reproduced with testSAX --noent from
the libxml2 distribution:
$ /home/pajas/h2/compile/gnome-xml/testSAX --noent test.xml
SAX.setDocumentLocator()
SAX.startDocument()
SAX.internalSubset(a, , )
SAX.entityDecl(b, 2, (null), b.txt, (null))
SAX.externalSubset(a, , )
SAX.startElement(a)
SAX.getEntity(b)
SAX.characters(B, 1)
SAX.characters(B, 1) <--- why?
SAX.endElement(a)
SAX.endDocument()
(similarly if b.txt is complex XML - I get the same callbacks for nodes in the
entity twice)
Is this an expected behavior? If yes, can I somehow distinguish between the
two calls (e.g. based on ctxt) so that I can filter one of them out?
P.S. this was observed by one of the users of the Perl bindings for libxml2.
We also have interface for libxml2's reader API in Perl too, but there are
hundreds of very popular Perl modules build upon the SAX interface (mainly
because Perl has really advanced sax filtering and pipelining with
interchangeable SAX implementations varying from pure-perl, expat, to
libxml2; libxml2 is the fastest among them which makes it very popular and
thus worth maintaining).
Thanks in advance,
-- Petr