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
}
}