Запись XML в java, создающая ненужные новые строки

Я использую w3c DOM для записи XML-файла. когда я создавал первый дочерний узел, проблем не возникало. Во второй раз, если я добавляю новый узел в уже существующий файл, он создает нежелательные новые строки в предыдущих узлах, и новые строки продолжают увеличиваться каждый раз, когда я вставлял новые узлы. Вот мой код...

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(new File("D:\\TestXml.xml"));
        Element rootElement = doc.getDocumentElement();
        Element supercar = doc.createElement("supercars");
        rootElement.appendChild(supercar);
        Element carname = doc.createElement("carname");
        carname.appendChild(doc.createTextNode("Ferrari 103"));
        supercar.appendChild(carname);
        Element carname1 = doc.createElement("carname");
        carname1.appendChild(doc.createTextNode("Ferrari 204"));
        supercar.appendChild(carname1);
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File("D:\\TestXml.xml"));
        transformer.transform(source, result);

А вот и сгенерированный файл.

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
        
    <supercars>
                
        <carname>Ferrari 101</carname>
                
        <carname>Ferrari 202</carname>
            
    </supercars>
    
    <supercars>
        <carname>Ferrari 103</carname>
        <carname>Ferrari 204</carname>
    </supercars>
</cars>

Приведенный выше код используется для добавления 2-го узла в первый раз, когда сгенерированный файл не имеет дополнительных новых строк. А если добавить 10 новых узлов, в файле будет так много ненужных новых строк, что получится более 300 строк. Также увеличился размер файла. Я не могу прийти к выводу, почему это происходит. Проблема возникает при каждой вставке нового узла. Любые предложения будут действительно полезны.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
233
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Рассмотрите возможность запуска XSLT преобразования идентичности, где его <xsl:strip-space> удаляет такие разрывы строк и пробелы между узлами. Вы можете легко включить XSLT в свой существующий код:

XSLT (сохраните ниже как файл .xsl, копирует весь документ как есть)

<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
    <xsl:output method = "xml" omit-xml-declaration = "yes" indent = "yes"/>
    <xsl:strip-space elements = "*"/>

    <xsl:template match = "node()|@*">
     <xsl:copy>
       <xsl:apply-templates select = "node()|@*"/>
     </xsl:copy>
    </xsl:template>
    
</xsl:stylesheet>

Джава

import javax.xml.transform.stream.StreamSource;
...

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(new File("D:\\TestXml.xml"));

Element rootElement = doc.getDocumentElement();
Element supercar = doc.createElement("supercars");
rootElement.appendChild(supercar);
Element carname = doc.createElement("carname");
carname.appendChild(doc.createTextNode("Ferrari 103"));
supercar.appendChild(carname);
Element carname1 = doc.createElement("carname");
carname1.appendChild(doc.createTextNode("Ferrari 204"));
supercar.appendChild(carname1);

Source xslt = new StreamSource(new File("C:\\Path\\To\\Style.xsl"));       // LOAD STYLESHEET
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(xslt);         // APPLY XSLT
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("D:\\TestXml.xml"));
transformer.transform(source, result);

Большое спасибо, это действительно помогло получить желаемый формат @Parfait

s.surya Prakash 25.12.2020 19:51

конечно брат понял

s.surya Prakash 27.12.2020 07:27

Другие вопросы по теме