Java 创建的XML文件中的缩进不正确

Java 创建的XML文件中的缩进不正确,java,xml,dom,pretty-print,Java,Xml,Dom,Pretty Print,我知道这个问题在这个网站上被问了很多次,但是之前的答案都不适用于我。 我已经编写了以下代码,其中我有两种不同的方法 1.CreateXmlFile -> This method creates an xml file with root tag 2.WriteXmlFile -> This method adds new nodes to the already created xml. 也许这就是我没有得到正确压痕的原因。 代码如下: public class CreateXml

我知道这个问题在这个网站上被问了很多次,但是之前的答案都不适用于我。 我已经编写了以下代码,其中我有两种不同的方法

1.CreateXmlFile -> This method creates an xml file with root tag
2.WriteXmlFile -> This method adds new nodes to the already created xml.
也许这就是我没有得到正确压痕的原因。 代码如下:

public class CreateXmlDemo {

    public static void main(String[] args) {
        CreateXmlDemo c1 = new CreateXmlDemo();
        c1.createXmlFile();

        CreateXmlDemo c2 = new CreateXmlDemo();
        CreateXmlDemo c3 = new CreateXmlDemo();
        CreateXmlDemo c4 = new CreateXmlDemo();

        CreateXmlDemo[] items= {c2,c3,c4};
        for(CreateXmlDemo item : items){
            item.writeXml();
        }
    }

    public void createXmlFile(){
        try{
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

            Document doc = docBuilder.newDocument();
            Element rootElement = doc.createElement("ITEMS");
            doc.appendChild(rootElement);

            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File("D:\\Faiz\\output.xml"));

            transformer.transform(source, result);
            }catch(Exception e){
                e.printStackTrace();
            }
        }

    public void writeXml(){

        try{
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

            Document doc = docBuilder.parse("D:\\Faiz\\output.xml");
            doc.normalize();
            Element rootElement = doc.getDocumentElement();

            Element item = doc.createElement("ITEM");


            Element id = doc.createElement("ID");
            id.appendChild(doc.createTextNode("1"));
            item.appendChild(id);

            Element name = doc.createElement("Name");
            name.appendChild(doc.createTextNode("James"));
            item.appendChild(name);

            rootElement.appendChild(item);

            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File("D:\\Faiz\\output.xml"));

            transformer.transform(source, result);
            }catch(Exception e){
                e.printStackTrace();
        }
    }
}
我得到以下输出:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ITEMS>
    <ITEM>
        <ID>1</ID>
        <Name>James</Name>
    </ITEM>
<ITEM>
        <ID>1</ID>
        <Name>James</Name>
    </ITEM>
<ITEM>
        <ID>1</ID>
        <Name>James</Name>
    </ITEM>
</ITEMS>

1.
詹姆斯
1.
詹姆斯
1.
詹姆斯
预期产出为:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ITEMS>
    <ITEM>
        <ID>1</ID>
        <Name>James</Name>
    </ITEM>
    <ITEM>
        <ID>1</ID>
        <Name>James</Name>
    </ITEM>
    <ITEM>
        <ID>1</ID>
        <Name>James</Name>
    </ITEM>
</ITEMS>

1.
詹姆斯
1.
詹姆斯
1.
詹姆斯
从观察上看,项目标签的缩进有问题。
请帮我解决这个问题。

我不明白缩进为什么不能正常工作,但我有一个解决办法:只有在循环完成后才能执行缩进。每次只想再次添加元素时,更改缩进是没有意义的

我添加了一个额外的方法
prettyPrint()
,其唯一目的是美化最终的XML

public class CreateXmlDemo {

private static String fileLocation = null;
public static void main(String[] args) {
    fileLocation = "D:\\Faiz\\output.xml";
    CreateXmlDemo c1 = new CreateXmlDemo();
    c1.createXmlFile();

    CreateXmlDemo c2 = new CreateXmlDemo();
    CreateXmlDemo c3 = new CreateXmlDemo();
    CreateXmlDemo c4 = new CreateXmlDemo();

    CreateXmlDemo[] items= {c2,c3,c4};
    for(CreateXmlDemo item : items){
        item.writeXml();
    }
    c1.prettyPrint();
}

public void createXmlFile(){
    try{
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

        Document doc = docBuilder.newDocument();
        Element rootElement = doc.createElement("ITEMS");
        doc.appendChild(rootElement);
        writeWithoutIndentation(doc);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

public void writeXml(){

    try{
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse(fileLocation);
        doc.normalize();
        Element rootElement = doc.getDocumentElement();
        Element item = doc.createElement("ITEM");           
        Element id = doc.createElement("ID");
        id.appendChild(doc.createTextNode("1"));
        item.appendChild(id);

        Element name = doc.createElement("Name");
        name.appendChild(doc.createTextNode("James"));
        item.appendChild(name);

        rootElement.appendChild(item);
        rootElement.normalize();
        writeWithoutIndentation(doc);
        }catch(Exception e){
            e.printStackTrace();
    }
}

public void writeWithoutIndentation(Document doc){
    try{
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File(fileLocation));
        transformer.transform(source, result);
    }catch(Exception e){
        e.printStackTrace();
    }
}

public void prettyPrint(){
    try{
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse(fileLocation);
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File(fileLocation));

        transformer.transform(source, result);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

上面的代码经过测试,我得到了上面显示的输出