2017-04-25 78 views
0

我知道這個問題已經在這個網站上被多次詢問過,但是之前的答案都沒有爲我工作過。 我已經寫了下面的代碼,在我有2種不同的方法縮進創建的XML文件不正確

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> 

預期輸出是:

<?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> 

observecarefully沒有與項的縮進問題標籤。 請幫助我。

+0

上面的代碼已經過測試,得到了上面顯示的輸出 –

回答

0

我不明白爲什麼縮進不能正常工作,但我有一個解決方法:只有在循環完成後才執行縮進。無論如何,每當你要添加元素時都要改變縮進。

我已經添加了一個額外的方法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(); 
     } 
    } 
} 
+0

非常感謝。它的工作正常。 –