By default, Xerces uses deferred DOM implementation to build DOM in memory
[1]. It should not cause any problems in the application code, since
deferred classes extend the corresponding DOM classes, i.e.
DeferredElementImpl extends ElementImpl.
As Jeff pointed out, your code probably has an error: you expect that the
first child of the element is element but in fact it is a Text node, hence
you get a CastException.
Instead, to traverse the DOM Tree you need to write some kind of a switch
statement, switching on a nodeType and casting to appropriate node, see
samples/dom/Counter.java.
[1] http://xml.apache.org/xerces2-j/features.html#dom.defer-node-expansion
Thank you,
--
Elena Litani/ IBM Toronto
Wednesday, December 17, 2003 11:39 AM
To: <[EMAIL PROTECTED]>
cc:
From: "Tim Davidson" <[EMAIL PROTECTED]>
Subject: How can you prevent DeferredTextImpl?
Hi,
I've searched the archives and this details my problem, but doesnt offer
me a solution. Basically, we need to be able to load a DOM and tell the
builder not to create any nodes which are DeferredTextImpl's. We havn't
had this problem 'till we added
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
to saving a DOM. Now when we load the DOM everwhere were we have
(Element)nodes.getNode(i) it causes a ClassCastException. The exception is
because now node's are not exclusively Elements but DeferredTextImpl's
aswell (see
http://xml.apache.org/xerces-j/apiDocs/org/apache/xerces/dom/DeferredTextImpl.html).
We expected that
factory.setIgnoringElementContentWhitespace(true);
would solve the problem, but it didn't. I've also tried
document.normalise() after generating the DOM but we are still getting the
CCE's?
We can't normalise or validate against a dtd when saving as we sometimes
load in externally generated XML files.
Any help would be much apprecitated.
<code>
public static Document generateDOM(InputSource p_is)
throws SAXException, IOException, ParserConfigurationException
{
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
factory.setIgnoringElementContentWhitespace(true);
factory.setIgnoringComments(true);
DocumentBuilder builder = factory.newDocumentBuilder();
return builder.parse(p_is);
}
</code>
From: Jeff Greif <[EMAIL PROTECTED]>
Subject: ClassCastException
Date: Thu, 7 Aug 2003 08:05:07 -0700
Content-Type: text/plain;
charset="iso-8859-1"
A DeferredTextImpl is a text node, not any kind of Element. This could
happen if
-- the document structure had changed and the code hadn't kept up
-- more likely, the treatment of white space is different, so a text node
is now appearing (and didn't on the other machines) between elements, e.g.
the x and y children of z in <z><x/><y/></z>. This would happen if the
document weren't normalized and was not validated against a DTD or Schema.
Jeff
----- Original Message -----
From: "Matt Cohen" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, August 07, 2003 12:24 AM
Subject: ClassCastException
> Hi,
>
> I've been developing using Xerces 2.4.0 and have successfully completed
xsd
> validation with schema in my application.
>
> However, now that I've moved it to our test machines, I'm getting the
> following exception:
>
> ClassCastException: com.apache.xerces.dom.DeferredTextImpl
>
> when I try to cast a Node to an Element:
>
> Element elem = (Element)sourceElem.getFirstChild();
>
> And sourceElem is definately not null.
>
> Now, I have xercesImpl.jar at the front of the classpath so no other
class
> copy could be picked up instead. And I can't seem to get why this is so?
> Is there any other possible package that could cause this? Anyone have
any
> thoughts?
>
> Thanks,
> -Matt
---------------------------------------------------------------------
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]