I convinced the organization that I'm currently consulting to start using Xerces
in our middle tier to return data retrieved from the database to the browser.
We actually have to first go through an ASP page before hitting the browser
(since the site is managed with IIS). In order to return the XML document to
the active server page, we're placing our data first into a DOM so that it
creates the structure for us, then we pull out the XML document as a string and
return it to the ASP. Here is the problem, I could not find a way to retrieve
the code from the XML document as a string, so I had to write my own. Am I
missing something, or am I correct in assuming that there is no way of pulling
the data out from the DOM as a string? I'd expect that there would be some
method on the DOM as follows:
Document doc = ...; // Get the document and fill it with the XML data.
String xmlDocAsString = doc.getXMLDocAsString();
return xmlDocAsString;
I went ahead and wrote my own, based on an example that I found on the IBM
development site in the Java/XML tutorial. The following is the code that I
wrote, which I hope is included into the Xerces implementation if the
functionality is not there yet. I'm sure that others will have a similar need:
String getXMLDocAsString(Node node)
{
String str = new String();
int type = node.getNodeType();
switch (type)
{
case Node.DOCUMENT_NODE:
{
str = str.concat("<?xml version=\"1.0\" ?>");
str =
str.concat(getXMLDocAsString(((Document)node).getDocumentElement()));
break;
}
case Node.ELEMENT_NODE:
{
str = str.concat("<");
str = str.concat(node.getNodeName());
NamedNodeMap attrs = node.getAttributes();
for (int i = 0; i < attrs.getLength(); i++)
{
Node attr = attrs.item(i);
str = str.concat(" " + attr.getNodeName() + "=\"" +
attr.getNodeValue() + "\"");
}
str = str.concat(">");
NodeList children = node.getChildNodes();
if (children != null)
{
int len = children.getLength();
for (int i = 0; i < len; i++)
str = str.concat(getXMLDocAsString(children.item(i)));
}
break;
}
case Node.ENTITY_REFERENCE_NODE:
{
str = str.concat("&");
str = str.concat(node.getNodeName());
str = str.concat(";");
break;
}
case Node.CDATA_SECTION_NODE:
{
str = str.concat("<![CDATA[");
str = str.concat(node.getNodeValue());
str = str.concat("]]>");
break;
}
case Node.TEXT_NODE:
{
str = str.concat(node.getNodeValue());
break;
}
case Node.PROCESSING_INSTRUCTION_NODE:
{
str = str.concat("<?");
str = str.concat(node.getNodeName());
String data = node.getNodeValue();
{
str = str.concat(" ");
str = str.concat(data);
}
str = str.concat("?>");
break;
}
}
if (type == Node.ELEMENT_NODE)
{
str = str.concat("</");
str = str.concat(node.getNodeName());
str = str.concat(">");
}
return str;
}
Thanks,
Ken Ramirez (Master-Mind Consulting Services, Inc. - [EMAIL PROTECTED] or
www.mastermind.com)