用 Java 编写 XML 会创建不必要的新行

时间:2020-12-25 17:23:36

标签: java xml dom

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

上面的代码用于第一次附加第二个节点,生成的文件没有额外的新行。 如果添加 10 个新节点,该文件有很多不必要的新行,导致 300 多行。 文件大小也增加了。 我无法得出为什么会发生这种情况的结论。 每次插入新节点都会出现问题。 任何建议都会非常有帮助。

1 个答案:

答案 0 :(得分: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>

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);
相关问题