Как вставить комментарий в XML документ?

199
23 февраля 2019, 01:20

Ниже код моей функции. Возможно, моя проблема заключается в том, что я неправильно понял как работает insertBefore. Работу этого метода я понял так, insertBefore имеет два параметра: первый параметр - узел, который хотим вставить, второй параметр - перед каким узлом хотим вставить. Вызываем сам метод insertBefore у того узла, для которого нововставленный узел будет дочерним. Если все так, тогда не могу понять, почему данный код не вставляет комментарий там, где нужно.

public static Document addCommentsToDocument(Object obj, String tagName, String comment) throws Exception{
        String fileName = new String("/home/albuquerque/XML.xml");
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.parse(file);
        document.getDocumentElement().normalize();
        Node root = document.getDocumentElement();
        NodeList listNode = root.getChildNodes();
        Comment com = document.createComment(comment);
        for (int i = 0; i < listNode.getLength(); i++) {
            Node node = listNode.item(i);
            root.insertBefore(com, node);
        }
return document;
}

Ниже код XML. Перед каждым тегом, кроме родительского нужно вставить комментарий.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<example>
    <a>a</a>
    <b>b</b>
    <string1>string1</string1>
    <string2>string2</string2>
</example>

Но вставка происходит такая:

<?xml version="1.0" encoding="UTF-8"?><example>
    <a>1</a>
    <b>1</b>
    <string1>string1</string1>
    <string2>string2</string2><!--it's a comment-->
</example>

Что не так я делаю?

Answer 1

Элемент вставлялся неправильно из-за того, что узел-комментарий был один и просто передвигался от одного элемента к другому, передвигаясь к самому последнему внутреннему элементу родительского тега. Решением оказалось создание на каждой итерации нового узла-коммента и добавлением его к нужному элементу.

n.getParentNode().insertBefore(document.createComment(comment), n);
  • n.getParentNode() - родитель для узла-комментария. Вызывать метод insertBefore() нужно как раз у подразумеваемого родителя.
  • далее нужно в insertBefore передать два аргумента. Первый аргумент - то, что нужно вставить. Второй аргумент - перед чем нужно вставить.
READ ALSO
model.addAttribute (Spring MVC)

model.addAttribute (Spring MVC)

Объясните, пожалуйста, что значит modeladdAttribute("some text", someObject);

174
Взаимодействие с java приложением

Взаимодействие с java приложением

Есть приложение в котором можно выполнять скрипты на JSЗадача - из этого приложения отправлять e-mail

146
Вопрос по Java Web

Вопрос по Java Web

кто может подсказать, нашёл такой код(отрывок):

135