2017-04-25 35 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 ITEMのインデントに問題がありますタグ。 私にこれを助けてください。

+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

ありがとうございます。そのうまく動作します。 –

関連する問題