diff --git a/src/main/java/io/fixprotocol/xml/XmlDiff.java b/src/main/java/io/fixprotocol/xml/XmlDiff.java index 1ef59da..0a253cf 100644 --- a/src/main/java/io/fixprotocol/xml/XmlDiff.java +++ b/src/main/java/io/fixprotocol/xml/XmlDiff.java @@ -436,7 +436,7 @@ private boolean diffText(Element element1, Element element2) { final Node child1 = element1.getFirstChild(); final Node child2 = element2.getFirstChild(); - if (child1 != null && Node.TEXT_NODE == child1.getNodeType()) { + if (child1 != null && Node.TEXT_NODE == child1.getNodeType() && !child1.getNodeValue().trim().isEmpty()) { if (child2 == null || Node.TEXT_NODE != child2.getNodeType()) { listener.accept(Event.remove(XpathUtil.getFullXPath(child1))); } else { @@ -451,7 +451,7 @@ private boolean diffText(Element element1, Element element2) { } } else if (child2 != null && Node.TEXT_NODE == child2.getNodeType() && child2.getNodeValue().trim().length() > 0) { - listener.accept(Event.add(XpathUtil.getFullXPath(child2), child2, append)); + listener.accept(Event.add(XpathUtil.getFullXPath(child2.getParentNode()), child2, append)); } return false; } diff --git a/src/main/java/io/fixprotocol/xml/XmlMerge.java b/src/main/java/io/fixprotocol/xml/XmlMerge.java index 7d95269..1901fb2 100644 --- a/src/main/java/io/fixprotocol/xml/XmlMerge.java +++ b/src/main/java/io/fixprotocol/xml/XmlMerge.java @@ -198,37 +198,41 @@ private void add(Document doc, XPath xpathEvaluator, Element patchOpElement) { } ((Element) siteNode).setAttribute(attribute.substring(1), value); } else { - Element value = null; - final NodeList children = patchOpElement.getChildNodes(); - for (int i = 0; i < children.getLength(); i++) { - final Node child = children.item(i); - if (Node.ELEMENT_NODE == child.getNodeType()) { - value = (Element) child; - break; - } - } - final Node imported = doc.importNode(value, true); + final Node parent; + Node before = null; switch (pos) { case "prepend": // siteNode is parent - make first child - siteNode.insertBefore(imported, siteNode.getFirstChild()); + parent = siteNode; + before = siteNode.getFirstChild(); break; case "before": // insert as sibling before siteNode - siteNode.getParentNode().insertBefore(imported, siteNode); + parent = siteNode.getParentNode(); + before = siteNode; break; case "after": // insert as sibling after siteNode + parent = siteNode.getParentNode(); final Node nextSibling = siteNode.getNextSibling(); if (nextSibling != null) { - siteNode.getParentNode().insertBefore(imported, nextSibling); - } else { - siteNode.getParentNode().appendChild(imported); + before = nextSibling; } break; default: // siteNode is parent - make last child - siteNode.appendChild(imported); + parent = siteNode; + } + + final NodeList children = patchOpElement.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + final Node child = children.item(i); + final Node imported = doc.importNode(child, true); + if (before != null) { + parent.insertBefore(imported, before); + } else { + parent.appendChild(imported); + } } } } diff --git a/src/test/java/io/fixprotocol/xml/XmlDiffTest.java b/src/test/java/io/fixprotocol/xml/XmlDiffTest.java index 7f2d232..dc45cf3 100644 --- a/src/test/java/io/fixprotocol/xml/XmlDiffTest.java +++ b/src/test/java/io/fixprotocol/xml/XmlDiffTest.java @@ -184,4 +184,23 @@ public void removeAttribute() throws Exception { } } + @Test + public void addText() throws Exception { + final String mergedFilename = "target/test/add-text-merged.xml"; + final String diffFilename = "src/test/resources/add-text-diff.xml"; + final String baseFilename = "src/test/resources/add-text-base.xml"; + + try ( + final FileInputStream isBase = new FileInputStream(baseFilename); + final FileInputStream isDiff = new FileInputStream(diffFilename); + final FileOutputStream osMerge = new FileOutputStream(mergedFilename)) { + xmlMerge.merge(isBase, isDiff, osMerge); + + Document doc = docBuilder.parse(mergedFilename); + NodeList elements = doc.getElementsByTagName("label"); + Element element = (Element) elements.item(0); + assertEquals("LABEL", element.getTextContent()); + } + } + } diff --git a/src/test/resources/add-text-base.xml b/src/test/resources/add-text-base.xml new file mode 100644 index 0000000..a1893e7 --- /dev/null +++ b/src/test/resources/add-text-base.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/src/test/resources/add-text-diff.xml b/src/test/resources/add-text-diff.xml new file mode 100644 index 0000000..9d30431 --- /dev/null +++ b/src/test/resources/add-text-diff.xml @@ -0,0 +1,3 @@ + + LABEL + \ No newline at end of file