diff --git a/xml/src/main/java/org/springframework/xml/dom/DomContentHandler.java b/xml/src/main/java/org/springframework/xml/dom/DomContentHandler.java index 5e3ddfa8..05dbc3fc 100644 --- a/xml/src/main/java/org/springframework/xml/dom/DomContentHandler.java +++ b/xml/src/main/java/org/springframework/xml/dom/DomContentHandler.java @@ -37,11 +37,11 @@ import org.xml.sax.helpers.DefaultHandler; */ public class DomContentHandler extends DefaultHandler { - private Document document; + private final Document document; - private List elements = new ArrayList(); + private final List elements = new ArrayList(); - private Node node; + private final Node node; /** * Creates a new instance of the DomContentHandler with the given node. @@ -54,6 +54,10 @@ public class DomContentHandler extends DefaultHandler { if (node instanceof Document) { document = (Document) node; } + else { + document = node.getOwnerDocument(); + } + Assert.notNull(document, "document must not be null"); } private Node getParent() { diff --git a/xml/src/test/java/org/springframework/xml/dom/DomContentHandlerTest.java b/xml/src/test/java/org/springframework/xml/dom/DomContentHandlerTest.java index b3000084..2b408f6d 100644 --- a/xml/src/test/java/org/springframework/xml/dom/DomContentHandlerTest.java +++ b/xml/src/test/java/org/springframework/xml/dom/DomContentHandlerTest.java @@ -22,17 +22,24 @@ import javax.xml.parsers.DocumentBuilderFactory; import org.custommonkey.xmlunit.XMLTestCase; import org.w3c.dom.Document; +import org.w3c.dom.Element; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; public class DomContentHandlerTest extends XMLTestCase { - private static final String XML_CONTENT_HANDLER = "" + "" + + private static final String XML_1 = "" + "" + "" + "content" + ""; + private static final String XML_2_EXPECTED = "" + "" + + "" + ""; + + private static final String XML_2_SNIPPET = + "" + ""; + private Document expected; private DomContentHandler handler; @@ -41,20 +48,33 @@ public class DomContentHandlerTest extends XMLTestCase { private XMLReader xmlReader; + private DocumentBuilder documentBuilder; + protected void setUp() throws Exception { xmlReader = XMLReaderFactory.createXMLReader(); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + documentBuilder = documentBuilderFactory.newDocumentBuilder(); result = documentBuilder.newDocument(); - handler = new DomContentHandler(result); - expected = documentBuilder.parse(new InputSource(new StringReader(XML_CONTENT_HANDLER))); + xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", false); } - public void testContentHandler() throws Exception { - xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", false); + public void testContentHandlerDocument() throws Exception { + handler = new DomContentHandler(result); + expected = documentBuilder.parse(new InputSource(new StringReader(XML_1))); xmlReader.setContentHandler(handler); - xmlReader.parse(new InputSource(new StringReader(XML_CONTENT_HANDLER))); + xmlReader.parse(new InputSource(new StringReader(XML_1))); assertXMLEqual("Invalid result", expected, result); } + + public void testContentHandlerElement() throws Exception { + Element rootElement = result.createElementNS("namespace", "root"); + result.appendChild(rootElement); + handler = new DomContentHandler(rootElement); + expected = documentBuilder.parse(new InputSource(new StringReader(XML_2_EXPECTED))); + xmlReader.setContentHandler(handler); + xmlReader.parse(new InputSource(new StringReader(XML_2_SNIPPET))); + assertXMLEqual("Invalid result", expected, result); + + } } \ No newline at end of file