Shlop
@Shlop
Full Stack Developer (PHP/Laravel/JavaScript)

Почему в xml файл появляются пустые строки между тегами, и как их убрать?

Здравствуйте, подскажите пожалуйста, есть xml файл:
<?xml version="1.0"?>
<countries>
    <country id="1">
        <continent>Северная Америка</continent>
        <name>Соединенные Штаты Америки</name>
        <area>9834000</area>
        <population>328915700</population>
        <minerals>Металлы,Алмазы,Бокситы,Барит,Золото</minerals>
    </country>
    <country id="2">
        <continent>Азия</continent>
        <name>Китай</name>
        <area>9597000</area>
        <population>1404328611</population>
        <minerals>Уголь,Железо,Медь,Алюминий</minerals>
    </country>
</countries>

Нужно сделать добавления новых стран в этот xml, реализовал это:
try {
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   DocumentBuilder builder = factory.newDocumentBuilder();
   Document document = builder.parse(xml);
   document.getDocumentElement().normalize();
   Element root = document.getDocumentElement();
   root.appendChild(Elements.getCountry(document));
   document.getDocumentElement().normalize();
   TransformerFactory transformerFactory = TransformerFactory.newInstance();
   Transformer transformer = transformerFactory.newTransformer();
   transformer.setOutputProperty(OutputKeys.INDENT, "yes");
   DOMSource source = new DOMSource(document);
   StreamResult file = new StreamResult(xml);
   transformer.transform(source, file);
   System.out.println("Новая запись успешно создана");
} catch (Exception e) {
    e.printStackTrace();
}

В итоге получаю такой xml на выходе:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<countries>
        
    <country id="1">
                
        <continent>Северная Америка</continent>
                
        <name>Соединенные Штаты Америки</name>
                
        <area>9834000</area>
                
        <population>328915700</population>
                
        <minerals>Металлы,Алмазы,Бокситы,Барит,Золото</minerals>
            
    </country>
        
    <country id="2">
                
        <continent>Азия</continent>
                
        <name>Китай</name>
                
        <area>9597000</area>
                
        <population>1404328611</population>
                
        <minerals>Уголь,Железо,Медь,Алюминий</minerals>
            
    </country>
    <country>
        <continent>qwe</continent>
        <name>qwe</name>
        <area>qwe</area>
        <population>qwe</population>
        <minerals>qwe</minerals>
    </country>
</countries>

То есть, те записи что были ранее в xml, между их тегами появляются пустые строки, а у новой записи которая была добавлена только что, всё нормально, пустых строк между тегами нету. Подскажите пожалуйста как убрать пустые строки, заранее благодарю за ответ.
  • Вопрос задан
  • 610 просмотров
Решения вопроса 1
Shlop
@Shlop Автор вопроса
Full Stack Developer (PHP/Laravel/JavaScript)
решил данную проблему, как я понял дело было в том, что вот это свойство которое устанавливается
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
добавляет отступы, а так как в файле xml у меня уже были записи, то к ним добавляются отступы ещё, по мимо тех что которые уже были в файле, поэтому я и получал пустые строки между тегами. Ну и решил проблему тем, что просто строю новый Document если нужно добавлять что то новое в xml и перезаписываю xml файл новыми данными, а раньше я просто дописывал в xml файл новые данные, и получал пустые строки между тегами.
Пример кода как я создаю новый Document:
public static Document modelsToDocument(ArrayList<Country> countries) throws ParserConfigurationException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.newDocument();
        Element root = document.createElement("countries");
        document.appendChild(root);
        for(Country country : countries) {
            root.appendChild(Elements.getCountry(document,country));
        }
        return document;
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы