用java编写xml创建不必要的新行

xqk2d5yq  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(262)

我正在使用w3cdom来编写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行。文件大小也增加了。我无法得出这样的结论。每次插入新节点都会出现问题。任何建议都会很有帮助。

tktrz96b

tktrz96b1#

考虑运行identity transform 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);

相关问题