Как работает нормализация Java (normalize)

228
20 сентября 2018, 15:50

Есть такой код, который создает дерево DOM из файла FILE_NAME, а метод writeFileXML() записывает изменения в файл:

public class Class1 
{
    public Document doc;
    public void initFileXML()
    {
        DocumentBuilder docbuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        doc = docbuilder.parse(FILE_NAME); 
        doc.normalize();
    } 

    public void writeFileXML()
    {
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");
        DOMSource source = new DOMSource(doc);
        FileOutputStream file = new FileOutputStream(FILE_NAME);
        StreamResult result = new StreamResult(file);
        transformer.transform(source, result); 
    } 

    public void readXML()
    {
        int i = 0;
        NodeList nodelist = doc.getElementsByTagName("taskParent");
        do
        {
            Node node = nodelist.item(i); 
            //и выводим в консоль
            System.out.println(node.getTextContent());
        }while(++i < nodelist.getLength());  
    }

    //И еще много разных методов
    ...
    ...
} 

и есть такой xml-файл:

<taskParent>
    <taskChild1>Текст1</taskChild1>
    <taskChild2>Текст2</taskChild2>
    <taskChild3>Текст3</taskChild3>
</taskParent>

Далее вызываем метод main():

public class Class2 
{
    public static void main(String[] args)
    {
        Class1 xml = new Class1();
        xml.initFileXML();//законнектимся к FILE_NAME
        //Добавим узлы
        ...
        ТекстA
        ...
        ТекстB
        ...
        ТекстD
        ...
        //и сразу же их считываем
        xml.readXML();
        //запишем изменения 
        xml.writeFileXML();
    }
}

и получаем вот такой xml-файл с добавленными узлами ТекстA, ТекстB, ТекстD:

<taskParent>
    <taskChild1>Текст1</taskChild1>
    <taskChild2>Текст2</taskChild2>
    <taskChild3>Текст3</taskChild3>
</taskParent>
<taskParent>
    <taskChild1>ТекстA</taskChild1>
    <taskChild2>ТекстB</taskChild2>
    <taskChild3>ТекстD</taskChild3>
</taskParent>

После вывода в консоль видим следующее:

Текст1
Текст2
Текст3
ТекстAТекстBТекстD

Должно было быть вот так:

ТекстA
ТекстB
ТекстD 

А оно отображает в одну строчку:

ТекстAТекстBТекстD

Как нормализовать тот текст, который только что добавил?

И еще: Если заново выполнить файл или в методе main() после вызова метода xml.addNodeXML() вставить эти методы: writeFileXML(); xml.initFileXML(), то информация из файла выводится уже вот так:

Текст1
Текст2
Текст3
ТекстA
ТекстB
ТекстD , т.е. как и нужно

Другие способы решения предлагать не нужно. Для чего нужен метод normalize() объяснять не нужно. Мне нужно понять как работает нормализация normalize(). Нигде внятной справки не нашел. На сайте oracle тоже ничего внятного нет.

Пытался посреди кода влепить doc.normalize(), но ничего не поменялось. Такое ощущение, что нормализация работает один раз и только при запуске программы.

READ ALSO
rmiregistry не запускается на localhost

rmiregistry не запускается на localhost

Есть специализированное приложение на java, которое не запускается под ubuntuПри запуске выдает, что не может соединится с rmiregistry

247
Работа отдельного потока с Jsoup. Android

Работа отдельного потока с Jsoup. Android

Был создан класс Parser,использующий Jsoup, который объединял в себе методы для парсинга значений с сайтаВ обычной консоли все его методы работали...

221
java SQLite не сохраняет строку

java SQLite не сохраняет строку

при нажатии на кнопку программа пытается сохранить строки в базу данныхВыглядит это так:

187