2012-07-16 5 views
0

AsyncTask을 확장하는 클래스가 있는데이 클래스는 XML 파일을 생성하기위한 클래스입니다.XML이 올바르게 생성되지 않습니다

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

이유는 ArrayList<Case>의 전체 내용을 표시 나던 : 여기에 내 수업

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은 다음과 같습니다입니까?

+0

비정상적으로 DOM 모델을 좋아하지 않는 한 [XmlSerializer] (http://developer.android.com/reference/org/xmlpull/v1/XmlSerializer.html)가 더 나은 선택 일 수 있습니다. – Jens

답변

1

문제는 자녀에게 제공하기 전에 항목을 추가하는 것으로 보입니다. for-loop 다음에이 줄을 이동하는 것이 좋습니다.

doc.appendChild(rootCase); 

for 루프의 내용을 다시 고려해야 할 수도 있습니다.

관련 문제