package com.fasterxml.jackson.databind.ext;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilderFactory;
import org.xml.sax.InputSource;
import org.w3c.dom.*;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TestDOM extends com.fasterxml.jackson.databind.BaseMapTest
{
final static String SIMPLE_XML =
"<root attr='3'><leaf>Rock & Roll!</leaf><?proc instr?></root>";
final static String SIMPLE_XML_NS =
"<root ns:attr='abc' xmlns:ns='http://foo' />";
private final ObjectMapper MAPPER = new ObjectMapper();
public void testSerializeSimpleNonNS() throws Exception
{
// Let's just parse first, easiest
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse
(new InputSource(new StringReader(SIMPLE_XML)));
assertNotNull(doc);
// need to strip xml declaration, if any
String outputRaw = MAPPER.writeValueAsString(doc);
// And re-parse as String, since JSON has quotes...
String output = MAPPER.readValue(outputRaw, String.class);
/* ... and finally, normalize to (close to) canonical XML
* output (single vs double quotes, xml declaration etc)
*/
assertEquals(SIMPLE_XML, normalizeOutput(output));
}
public void testDeserializeNonNS() throws Exception
{
for (int i = 0; i < 2; ++i) {
Document doc;
if (i == 0) {
// First, as Document:
doc = MAPPER.readValue(quote(SIMPLE_XML), Document.class);
} else {
// and then as plain Node (no difference)
Node node = MAPPER.readValue(quote(SIMPLE_XML), Node.class);
doc = (Document) node;
}
Element root = doc.getDocumentElement();
assertNotNull(root);
// non-ns, simple...
assertEquals("root", root.getTagName());
assertEquals("3", root.getAttribute("attr"));
assertEquals(1, root.getAttributes().getLength());
NodeList nodes = root.getChildNodes();
assertEquals(2, nodes.getLength());
Element leaf = (Element) nodes.item(0);
assertEquals("leaf", leaf.getTagName());
assertEquals(0, leaf.getAttributes().getLength());
//"<root attr='3'><leaf>Rock & Roll!</leaf><?proc instr?></root>";
ProcessingInstruction pi = (ProcessingInstruction) nodes.item(1);
assertEquals("proc", pi.getTarget());
assertEquals("instr", pi.getData());
}
}
public void testDeserializeNS() throws Exception
{
Document doc = MAPPER.readValue(quote(SIMPLE_XML_NS), Document.class);
Element root = doc.getDocumentElement();
assertNotNull(root);
assertEquals("root", root.getTagName());
// Not sure if it ought to be "" or null...
String uri = root.getNamespaceURI();
assertTrue((uri == null) || "".equals(uri));
// no child nodes:
assertEquals(0, root.getChildNodes().getLength());
// DOM is weird, includes ns decls as attributes...
assertEquals(2, root.getAttributes().getLength());
assertEquals("abc", root.getAttributeNS("http://foo", "attr"));
}
/*
/**********************************************************
/* Helper methods
/**********************************************************
*/
protected static String normalizeOutput(String output)
{
// XML declaration to get rid of?
output = output.trim();
if (output.startsWith("<?xml")) {
// can find closing '>' of xml decl...
output = output.substring(output.indexOf('>')+1).trim();
}
// And replace double quotes with single-quotes...
return output.replace('"', '\'');
}
}