Dear Christian,
I've no idea why DOM/LS still doesn't work, but with the SAXSerializer the
problem is no more. When the SAXSerialier works query result can easily
converted into any DOM using a simple ContentHandler implementation:
/**
* Constructs a DOM from SAX events.
* Original idea by Florent Georges.
*/
public class SaxToDomHandler implements ContentHandler
{
private final DocumentBuilder documentBuilder;
private Document document;
private Node current;
public SaxToDomHandler(DocumentBuilder documentBuilder)
{
this.documentBuilder = documentBuilder;
}
/**
* Returns the created document.
*/
public Document getDocument()
{
return document;
}
@Override
public void startDocument() throws SAXException
{
document = documentBuilder.newDocument();
current = document;
}
@Override
public void startElement(String uri, String name, String qName,
Attributes attrs)
{
Element element = document.createElementNS(uri, qName);
for (int i = 0; i < attrs.getLength(); i++)
{
String nsURI = attrs.getURI(i);
String qname = attrs.getQName(i);
String value = attrs.getValue(i);
Attr attr = document.createAttributeNS(nsURI,
qname);
attr.setValue(value);
element.setAttributeNodeNS(attr);
}
current.appendChild(element);
current = element;
}
@Override
public void endElement(String uri, String name, String qName)
{
current = current.getParentNode();
}
@Override
public void endDocument() throws SAXException
{
current = current.getOwnerDocument();
}
@Override
public void characters(char[] ch, int start, int length)
{
String string = new String(ch, start, length);
current.appendChild(document.createTextNode(string));
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length)
{
characters(ch, start, length);
}
@Override
public void processingInstruction(String target, String data)
{
current.appendChild(document
.createProcessingInstruction(target, data));
}
@Override
public void setDocumentLocator(Locator locator)
{
//NOP
}
@Override
public void startPrefixMapping(String prefix, String uri) throws
SAXException
{
//NOP
}
@Override
public void endPrefixMapping(String prefix) throws SAXException
{
//NOP
}
@Override
public void skippedEntity(String name) throws SAXException
{
//NOP
}
}