Я использую 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 строк. Также увеличился размер файла. Я не могу прийти к выводу, почему это происходит. Проблема возникает при каждой вставке нового узла. Любые предложения будут действительно полезны.
Рассмотрите возможность запуска 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