Author: msahyoun Date: Thu Aug 25 05:15:25 2016 New Revision: 1757604 URL: http://svn.apache.org/viewvc?rev=1757604&view=rev Log: PDFBOX-3471: ensure that all nodes are visited when removing; ignore comments
Modified: pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java Modified: pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java?rev=1757604&r1=1757603&r2=1757604&view=diff ============================================================================== --- pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java (original) +++ pdfbox/trunk/xmpbox/src/main/java/org/apache/xmpbox/xml/DomXmpParser.java Thu Aug 25 05:15:25 2016 @@ -789,25 +789,32 @@ public class DomXmpParser */ private void removeComments(Node root) { - if (root.getChildNodes().getLength()<=1) + // will hold the nodes which are to be deleted + List<Node> forDeletion = new ArrayList<Node>(); + + NodeList nl = root.getChildNodes(); + + if (nl.getLength()<=1) { // There is only one node so we do not remove it return; } - NodeList nl = root.getChildNodes(); - for (int i=0; i < nl.getLength(); i++) + + for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i); if (node instanceof Comment) { - // remove the comment - root.removeChild(node); + // comments to be deleted + forDeletion.add(node); } else if (node instanceof Text) { if (node.getTextContent().trim().isEmpty()) { - root.removeChild(node); + // TODO: verify why this is necessary + // empty text nodes to be deleted + forDeletion.add(node); } } else if (node instanceof Element) @@ -816,6 +823,12 @@ public class DomXmpParser removeComments(node); } // else do nothing } + + // now remove the child nodes + for (Node node : forDeletion) + { + root.removeChild(node); + } } private AbstractStructuredType instanciateStructured(TypeMapping tm, Types type, String name,