簡體   English   中英

XML 寫入 java 創建不必要的新行

[英]XML writing in java creating unnecessary new lines

我正在使用 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>

上面的代碼用於 append 的第二個節點第一次生成的文件沒有額外的新行。 如果添加 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>

Java

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM