Java: дочерний элемент xml не удаляется с помощью removeChild

У меня есть XML, как указано ниже. Я хочу рекурсивно удалить пустые теги из того же. Например, как только тег f удаляется, тег e должен быть удален, а когда тег e удаляется, тег d становится пустым и, следовательно, также должен быть удален.

<Test>
  <a>test</a>
  <b>test</b>
  <c></c>
     <d>
        <e>
           <f> </f>
        </e>
     </d>
</Test>

результат должен быть

<Test>
  <a>test</a>
  <b>test</b>
</Test>

Я могу удалить тег, но я не могу удалить тег, так как в нем есть пустое место. Хотя я могу идентифицировать это как тег, который нужно удалить, но когда я вызываю removeChild() для его родителя, он не удаляется из XML. В коде во время отладки он показывает количество дочерних элементов e после вызова removeChild() как ноль. Но все равно остается в xml??

Пожалуйста, помогите мне, что я делаю не так.

Пожалуйста, найдите ниже мой код, который я использую.

for (Element childElement : toRemove) {
        Node parentNode = childElement.getParentNode();
        System.out.println("Removing null or empty node :: " + childElement.getNodeName());

        if(parentNode!=null){
            NodeList childList = parentNode.getChildNodes();
            System.out.println("List of Childer before deleting :: " + childList.getLength());

            parentNode.removeChild(childElement);
            clean(parentNode);

            childList = parentNode.getChildNodes();
            int childCount = childList.getLength();

            for (int i = 0; i < childCount; i++) {
                Node childNode = childList.item(i);
                System.out.println("Childs :: " + childNode);
            }

            for (int i = 0; i < childCount; i++) {
                Node childNode = childList.item(i);
                if(childNode!=null){
                    System.out.println("Child before deleting :: " + childNode);

                    if (childNode instanceof Element == false){
                        if(childNode.getNodeValue().trim().isEmpty()){
                            System.out.println("found unwanted :: " + childNode.getNodeName());

                            parentNode.removeChild(childNode);
                            i--;
                            childCount--;
                            clean(parentNode);
                        }
                    }
                }
            }

            childList = parentNode.getChildNodes();
            System.out.println("List of Childer after deleting :: " + childList.getLength());
        }
    }

person user2500313    schedule 29.12.2014    source источник
comment
Если между тегами нет пробела, как в вместо ‹f› ‹/f›, если тег был похож на ‹f›‹/f›, то есть без этого пустого места посередине. Он может удалить тег. Я даже пытался установить значение null или пустое для узла перед удалением, но это тоже не работает. Пожалуйста помоги !!!!!   -  person user2500313    schedule 30.12.2014


Ответы (1)


Из вашего кода вы проверяете, что значение узла пусто. Но лучше будет добавить больше условий. Дочерние узлы могут быть не только пустыми, но и иметь нулевое значение. <f/> вернет вам null

Поэтому убедитесь, что все возможности нулевых, пустых и пробельных значений могут удалить дочерний узел.

person Krishanthy Mohanachandran    schedule 22.01.2015