1

我在arraylist中有大约3000个元素。需要将这3000个元素写入xml。执行花费了太多时间,例如 Eclipse 中的 20 分钟。有没有有效的方法来做到这一点?或对我的代码进行任何修改?

arraylist 中的元素应该在未来增长......

我的代码片段..

---------------------------------------------------
---------------------------------------------------
for(int i=0;i<candidates.size();i++)//Candidates is my arraylist
            {
                String text=candidates.get(i);
                //System.out.println(text);
                text=text+"\n";
                file= new File("./test.xml");
                WriteToXML wr= new WriteToXML(file,"fullname",text);

            }
-------------------------------------------------------
-------------------------------------------------------
//WritetoXML class constructor
public WriteToXML(File xml,String tag,String data)
{
    try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setValidating(false);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new FileInputStream(new File(xml)));
        Element element =  doc.getDocumentElement();
        NodeList node1 = doc.getElementsByTagName(tag);
        Element fn= (Element) node1.item(0);
        Text text = doc.createTextNode(data);
        fn.appendChild(text);
        printtoXML(doc);
    } catch (Exception e) {
            System.out.println(e.getMessage());
            }
}
public static final void printtoXML(Document xml) throws Exception {
    Transformer tf = TransformerFactory.newInstance().newTransformer();
    tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    tf.setOutputProperty(OutputKeys.INDENT, "yes");
    StringWriter sw = new StringWriter();
    StreamResult result = new StreamResult(sw); 
    DOMSource source = new DOMSource(xml);
    tf.transform(source, result);
    String xmlString = sw.toString();
    File file= new File(xml);
    FileWriter fw=new FileWriter(file,false);
    BufferedWriter bw = new BufferedWriter(fw);
    bw.write(xmlString);
    bw.flush();
    bw.close(); 
}
4

4 回答 4

2

现在,您正在为 3000 个元素中的每一个执行此操作:

  1. 打开文件
  2. 在那里解析文档
  3. 在 dom 结构中添加一个元素
  4. 将文件刷新到磁盘并关闭它

更快的方法是只执行一次步骤 1、2 和 4(循环前 1 和 2;循环后 4),然后对列表中的每个元素(循环中)执行第 3 步。只需编写一个新方法,该方法采用您的tag变量和一个Document实例并将标签添加到文档中。

这里真正昂贵的是对象结构到 XML 的多次转换和返回。这有很大的开销。文件 IO 也带来了很多开销,但与 DOM 结构的多次创建和解析相比,即使这样也应该很小。

于 2013-10-23T08:12:14.280 回答
1

将 for 循环放在 WriteToXML() 中。

主功能:

file= new File("./test.xml");
WriteToXML wr= new WriteToXML(file,"fullname",candidates)

WriteToXML 内部

public WriteToXML(File xml,String tag,List candidates )
{
    try {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    dbf.setValidating(false);
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(new FileInputStream(new File(xml)));
    Element element =  doc.getDocumentElement();
    NodeList node1 = doc.getElementsByTagName(tag);
    Element fn= (Element) node1.item(0);
    for (int i=0;i<candidates.size();i++) { 
        Text text = doc.createTextNode(candidates.get(i)+"\n");
        fn.appendChild(text);
    }
    printtoXML(doc);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

这样您就不会一直重新解析 XML 并且只编写一次。

我试图做最小的改变。我不建议在构造函数中这样做——除非有充分的理由这样做。

于 2013-10-23T08:26:37.087 回答
1

正如@Masud 建议的那样,使用 SAX 没有其他方法。有一个关于从任意数据结构生成 XML的很好的例子

于 2013-10-23T08:20:57.287 回答
1

使用SAX而不是DOM. SAXDOM

于 2013-10-23T08:02:16.967 回答