diff --git a/oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java b/oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java index fce31849..ca5a8e60 100644 --- a/oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java +++ b/oxm/src/main/java/org/springframework/oxm/xstream/XStreamMarshaller.java @@ -45,6 +45,7 @@ import com.thoughtworks.xstream.io.xml.QNameMap; import com.thoughtworks.xstream.io.xml.SaxWriter; import com.thoughtworks.xstream.io.xml.StaxReader; import com.thoughtworks.xstream.io.xml.StaxWriter; +import com.thoughtworks.xstream.io.xml.XmlFriendlyReplacer; import com.thoughtworks.xstream.io.xml.XppReader; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -309,7 +310,7 @@ public class XStreamMarshaller extends AbstractMarshaller { streamWriter = new DomWriter((Document) node); } else if (node instanceof Element) { - streamWriter = new DomWriter((Element) node); + streamWriter = new DomWriter((Element) node, node.getOwnerDocument(), new XmlFriendlyReplacer()); } else { throw new IllegalArgumentException("DOMResult contains neither Document nor Element"); diff --git a/oxm/src/test/java/org/springframework/oxm/xstream/XStreamMarshallerTest.java b/oxm/src/test/java/org/springframework/oxm/xstream/XStreamMarshallerTest.java index fba1597a..0dda2fb7 100644 --- a/oxm/src/test/java/org/springframework/oxm/xstream/XStreamMarshallerTest.java +++ b/oxm/src/test/java/org/springframework/oxm/xstream/XStreamMarshallerTest.java @@ -77,6 +77,34 @@ public class XStreamMarshallerTest extends XMLTestCase { assertXMLEqual("Marshaller writes invalid DOMResult", expected, document); } + // see SWS-392 + public void testMarshalDOMResultToExistentDocument() throws Exception { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); + Document existent = builder.newDocument(); + Element rootElement = existent.createElement("root"); + Element flightsElement = existent.createElement("flights"); + rootElement.appendChild(flightsElement); + existent.appendChild(rootElement); + + // marshall into the existent document + DOMResult domResult = new DOMResult(flightsElement); + marshaller.marshal(flight, domResult); + + Document expected = builder.newDocument(); + Element eRootElement = expected.createElement("root"); + Element eFlightsElement = expected.createElement("flights"); + Element eFlightElement = expected.createElement("flight"); + eRootElement.appendChild(eFlightsElement); + eFlightsElement.appendChild(eFlightElement); + expected.appendChild(eRootElement); + Element eNumberElement = expected.createElement("flightNumber"); + eFlightElement.appendChild(eNumberElement); + Text text = expected.createTextNode("42"); + eNumberElement.appendChild(text); + assertXMLEqual("Marshaller writes invalid DOMResult", expected, existent); + } + public void testMarshalStreamResultWriter() throws Exception { StringWriter writer = new StringWriter(); StreamResult result = new StreamResult(writer);