2012-04-19 49 views
1

這是一個簡單的問題。但我無法調試它。我有類「Adding.java」,增加了一些數據ArrayList的如何在Java中將Arraylist的內容寫入xml文件

public class Adding { 

WriteFile ob = new WriteFile(); 

ArrayList list = new ArrayList(); 
public void add(){ 

    list.add("Tim"); 
    list.add(2333); 
    list.add(23); 

    list.add("John"); 
    list.add(423); 
    list.add(23); 

    ob.writeXmlFile(list); 

    } } 

和其他類「WriteFile.java」,創建一個XML文件

public class WriteFile { 

public void writeXmlFile(ArrayList<Object> list) { 

    try { 

     DocumentBuilderFactory dFact = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder build = dFact.newDocumentBuilder(); 
     Document doc = build.newDocument(); 

     Element root = doc.createElement("Studentinfo"); 
     doc.appendChild(root); 

     Element Details = doc.createElement("Details"); 
     root.appendChild(Details); 


     for(int i=0; i<list.size(); i ++) { 

      Element name = doc.createElement("Name"); 
      name.appendChild(doc.createTextNode(String.valueOf(list.get(i)))); 
      Details.appendChild(name); 

      Element id = doc.createElement("ID"); 
      id.appendChild(doc.createTextNode(String.valueOf(list.get(i)))); 
      Details.appendChild(id); 


      Element mmi = doc.createElement("Age"); 
      mmi.appendChild(doc.createTextNode(String.valueOf(list.get(i)))); 
      Details.appendChild(mmi); 

     } 


     // Save the document to the disk file 
     TransformerFactory tranFactory = TransformerFactory.newInstance(); 
     Transformer aTransformer = tranFactory.newTransformer(); 

     // format the XML nicely 
     aTransformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1"); 

     aTransformer.setOutputProperty(
       "{http://xml.apache.org/xslt}indent-amount", "4"); 
     aTransformer.setOutputProperty(OutputKeys.INDENT, "yes"); 



     DOMSource source = new DOMSource(doc); 
     try { 
      FileWriter fos = new FileWriter("/home/ros.xml"); 
      StreamResult result = new StreamResult(fos); 
      aTransformer.transform(source, result); 

     } catch (IOException e) { 

      e.printStackTrace(); 
     } 



    } catch (TransformerException ex) { 
     System.out.println("Error outputting document"); 

    } catch (ParserConfigurationException ex) { 
     System.out.println("Error building document"); 
    } 

當我執行此我獲得以下輸出

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> 
     <Studentinfo> 
      <Details> 
        <name>Tim</name> 
        <Id>Tim</Id> 
        <age>Tim</age> 
        <name>2333</name> 
        <Id>2333</Id> 
        <age>2333</age> 
        ..... 
       </Details> 
     </studentinfo> 

等等。但我想最終輸出是這種形式

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> 
     <Studentinfo> 
      <Details> 
        <name>Tim</name> 
        <Id>2333</Id> 
        <age>23</age> 

        <name>John</name> 
        <Id>423</Id> 
        <age>2333</age> 
        <size>23</size> 
      </Details> 
     </studentinfo> 

「for」循環遍歷「list」元素是否有任何問題? 。任何幫助表示讚賞。在此先感謝

+0

你真的明白你是如何將條目添加到列表以及從數組列表返回什麼'get(index)'?顯然你沒有,看看你的書中如何使用列表... – Nim 2012-04-19 11:29:27

回答

2

爲什麼不把學生對象存儲在你的列表中,每個對象都有一個名字,一個ID和一個年齡?這將更易於維護,並且易於編程?

此刻,您在列表中使用相同的索引來查找三個屬性。您需要在循環中循環執行3步,並獲取元素i,i + 1和i + 2以使其工作。

list.add(new Student("Tim", 2333, 23)); 
list.add(new Student("John", 423, 23)); 

... 

for (Student student : studentList) { 
    ... 
    name.appendChild(doc.createTextNode(student.getName())); 
    ... 
    id.appendChild(doc.createTextNode(Integer.toString(student.getId()))); 
    ... 
    age.appendChild(doc.createTextNode(Integer.toString(student.getAge()))); 
} 
+0

是的,我已經做了你所建議的必要的變化。謝謝您的幫助 – user745475 2012-04-19 13:10:50

1

你需要通過你的列表中的增量迭代的3:

for(int i=0; i<list.size() - 2; i += 3) { 

     Element name = doc.createElement("Name"); 
     name.appendChild(doc.createTextNode(String.valueOf(list.get(i)))); 
     Details.appendChild(name); 

     Element id = doc.createElement("ID"); 
     id.appendChild(doc.createTextNode(String.valueOf(list.get(i + 1)))); 
     Details.appendChild(id); 


     Element mmi = doc.createElement("Age"); 
     mmi.appendChild(doc.createTextNode(String.valueOf(list.get(i + 2)))); 
     Details.appendChild(mmi); 

    } 

但你可能會更好存儲在一個自定義類的列表對象,與姓名,身份證專用領域和年齡。

0

這是一個明確的XML文件的例子:

Element root = doc.createElement("RectanglesInfo"); 
doc.appendChild(root); 

for(int i=0; i<rectangles.size(); i ++) { 

    Element rectangle = doc.createElement("Rectangle"); 
    root.appendChild(rectangle); 


    Element width = doc.createElement("width"); 
width.appendChild(doc.createTextNode(Double.toString(rectangles.get(i).getWidth()))); 
    rectangle.appendChild(width); 

    Element height = doc.createElement("height"); 
    height.appendChild(doc.createTextNode(Double.toString(rectangles.get(i).getHeight()))); 
    rectangle.appendChild(height); 

} 

,結果會是這樣:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> 
<RectanglesInfo> 
    <Rectangle> 
     <width>89.0</width> 
     <height>85.0</height> 
    </Rectangle> 
    <Rectangle> 
     <width>205.0</width> 
     <height>212.0</height> 
    </Rectangle> 
</RectanglesInfo> 

所以不是矩形的,你可以添加的信息你學生們。