2012-04-19 50 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> 

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