2012-07-16 98 views
0

我得到了一个延伸AsyncTask的类,该类用于生成一个XML文件。这里是我的类XML无法正确生成android

import java.io.File; 
import java.util.ArrayList; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerConfigurationException; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Attr; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 

import android.app.ProgressDialog; 
import android.content.Context; 
import android.os.AsyncTask; 

import android.util.Log; 
import android.widget.Toast; 

public class GenerateXML extends AsyncTask<String, Void, String> { 

private final static String TAG = "GENECREATE_XML: "; 

DocumentBuilder docBuilder; 
DocumentBuilderFactory docFactory; 

ArrayList<Case> caseArray; 
Context c; 

ProgressDialog pd; 

String address; 



public GenerateXML(ArrayList<Case> caseArray, Context c) { 

    caseArray = new ArrayList<Case>(); 

    this.caseArray = caseArray; 
    this.c = c; 

    address = "/sdcard/case.xml"; 

} 

protected void onPreExecute() { 

     pd=ProgressDialog.show(c,"Please Wait..","Generating XML",false); 

} 

@Override 
protected String doInBackground(String... params) { 

    int i = 0; 

    docFactory = DocumentBuilderFactory.newInstance(); 

    try { 
     docBuilder = docFactory.newDocumentBuilder(); 
    } catch (ParserConfigurationException e) { 
     Log.e(TAG, e.getMessage()); 
    } 

    Document doc = docBuilder.newDocument(); 

    //root element in the xml 
    Element rootCase = doc.createElement("Cases"); 
    doc.appendChild(rootCase); 


    for(Case cases : caseArray) { 

    // case elements 
    Element caseElement = doc.createElement("case"); 
    rootCase.appendChild(caseElement); 

    // set attribute to staff element 
    Attr attr = doc.createAttribute("id"); 
    attr.setValue(Integer.toString((++i))); 
    caseElement.setAttributeNode(attr); 

    // pcn 
    Element pcn = doc.createElement("pcn"); 
    pcn.appendChild(doc.createTextNode(cases.getCaseNumber())); 
    caseElement.appendChild(pcn); 

    //status 
    Element status = doc.createElement("status"); 
    status.appendChild(doc.createTextNode(Integer.toString(cases.getStatus()))); 
    caseElement.appendChild(status); 

    //date 
    Element date = doc.createElement("date"); 
    date.appendChild(doc.createTextNode(cases.getDate())); 
    caseElement.appendChild(pcn); 

    } 


    TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
    Transformer transformer = null; 
    try { 
     transformer = transformerFactory.newTransformer(); 
    } catch (TransformerConfigurationException e) { 
     Log.e(TAG, e.getMessage()); 
    } 

    DOMSource source = new DOMSource(doc); 
    StreamResult result = new StreamResult(new File(address)); 



    try { 
     transformer.transform(source, result); 
    } catch (TransformerException e) { 
     Log.e(TAG, e.getMessage()); 
    } 


    return null; 
} 

protected void onPostExecute(String result) { 
    pd.dismiss(); 
    Toast.makeText(c, "Finished. File saved to: " + address, Toast.LENGTH_LONG).show(); 
} 

}

我的XML看起来是这样的:

<?xml version="1.0" encoding="UTF-8"?> 
<Cases/> 

为什么犯规它显示ArrayList<Case>的全部内容?

+0

除非您异常喜欢DOM模型,否则[XmlSerializer](http://developer.android.com/reference/org/xmlpull/v1/XmlSerializer.html)可能是更好的选择。 – Jens 2012-07-16 14:58:21

回答

1

这个问题看起来是你在给他们的孩子之前追加物品。我建议您在for循环后移动此行:

doc.appendChild(rootCase); 

您可能还需要重新考虑for-loop的内容。