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