Thanks for the tip, Elliotte. I'll remember it
when I use SAX. I'm using XNI in this case. I
suppose I could use SAX, but I'm really just
trying to migrate from Xerces1 to Xerces2 for
XMLC. XMLC already depends directly on Xerces
because of the custom DOM's XMLC implements. I
also wanted to change as little as possible. I
may make more radical changes once I've proven
that I can make things work properly with minimal changes.
In any case, I think I've got the internal subset
stuff working, except for one thing. Take the following document...
<?xml version="1.0" standalone="no"?>
<!DOCTYPE document SYSTEM "document.dtd" [
<!ENTITY head SYSTEM "header.xml">
<!ENTITY foot SYSTEM "footer.xml">
<!ENTITY torso SYSTEM "body.xml">
<!ENTITY erh "Elliotte Rusty Harold">
]>
<document>
&head; &torso; &foot;
</document>
The only part of this that ends up in the
internal subset is the "erh" entity. That is,
the internalEntityDecl() method gets called only
for the "erh" entity and is not notified at all
for the other entities. Then, as I build up the
DOM, I create EntityReference's for "&head;
&torso; &foot;" in the <document>. Upon
serialization, they end up being there in the
document, but since I was never notified to
create the corresponding <!ENTITY> elements in
the internal subset, re-parsing of the serialized
document fails. So, how do I get notified about
these so I can get them into the DOM unparsed? I
want the serialized DOM to look as identical as
possible to the above. I must be missing something.
Jake
At 06:41 AM 4/4/2006, you wrote:
>The trick is to look for the entity name "[dtd]". XOM accomplishes this
>thusly using pure SAX:
>
>
> protected boolean inExternalSubset = false;
>
> // We have a problem here. Xerces gets this right,
> // but Crimson and possibly other parsers don't properly
> // report these entities, or perhaps just not tag them
> // with [dtd] like they're supposed to.
> public void startEntity(String name) {
> if (name.equals("[dtd]")) inExternalSubset = true;
> }
>
>
> public void endEntity(String name) {
> if (name.equals("[dtd]")) inExternalSubset = false;
> }
>
>You can just reverse the logic if you prefer inInternalSubset.
>
>--
>Elliotte Rusty Harold [EMAIL PROTECTED]
>XML in a Nutshell 3rd Edition Just Published!
>http://www.cafeconleche.org/books/xian3/
>http://www.amazon.com/exec/obidos/ISBN=0596007647/cafeaulaitA/ref=nosim
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]