-1

私は独自の Android アプリケーションを実行していますが、問題が発生しています。

私のアプリは XML ファイルを読み書きします。SDCard から XML ファイルを開くには、次のコードを使用します。

public void abrirSD()
    {
        try{
             DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
             DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
             dom = docBuilder.parse(new File("mnt/sdcard/gastos.xml"));


        }
        catch (Exception e) {
            e.printStackTrace();
            }
    }

ファイルに情報を追加するには、次のコードでうまく機能します。

public boolean nuevo(Gasto clGasto)
    {
        this.abrirSD();

        String strDesc=clGasto.getDescripcion();
        String strMonto=Double.toString(clGasto.getMonto());
        java.util.Date date = new java.util.Date();
        java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("dd/MM/yyyy");
        String strFecha = sdf.format(date);

        Node gastos=dom.getFirstChild();
        Node gasto= dom.createElement("gasto");
        Element descripcion= dom.createElement("descripcion");
        descripcion.appendChild(dom.createTextNode(strDesc));
        gasto.appendChild(descripcion);
        Element monto= dom.createElement("monto");
        monto.appendChild(dom.createTextNode(strMonto));
        gasto.appendChild(monto);
        Element fecha= dom.createElement("fecha");
        fecha.appendChild(dom.createTextNode(strFecha));
        gasto.appendChild(fecha);
        gastos.appendChild(gasto);
        try
        {
            Transformer transformer = TransformerFactory.newInstance().newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            StreamResult streamResult = new StreamResult(new File("mnt/sdcard/gastos.xml"));
            DOMSource source = new DOMSource(dom);
            transformer.transform(source, streamResult);
            return true;
        }
        catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

しかし、これは読み取り情報の場合は機能しません

public List<Gasto> getAll()
    {

        List<Gasto> gastos = new ArrayList<Gasto>();
        this.abrirSD();

        //this.abrirArchivo();

        //Nos posicionamos en el nodo principal del árbol (<gastos>)
        Element root = dom.getDocumentElement();

        //Localizamos todos los elementos <item>
        NodeList items = root.getElementsByTagName("gasto");

        //Recorremos la lista de gastos
        for(int i=0;i<items.getLength();i++)
        {
            Gasto gasto= new Gasto();

            //Obtenemos el gasto actual
            Node item=items.item(i);

            //Obtenemos la lista de datos del gasto actual
            NodeList datosGasto = item.getChildNodes();

            //Procesamos cada dato de el gasto actual
            for (int j=0; j<datosGasto.getLength(); j++)
            {

                //asigno a dato el item actual
                Node dato= datosGasto.item(j);

                //Obtengo la etiqueta el item actual
                String etiqueta= dato.getNodeName();

                if(etiqueta.equals("descripcion"))
                {
                    String texto= obtenerTexto(dato);
                    gasto.setDescripcion(texto);

                }
                else if(etiqueta.equals("monto"))
                {
                    gasto.setMonto(Double.parseDouble(dato.getFirstChild().getNodeValue()));
                }

                else if(etiqueta.equals("fecha"))
                {
                    java.util.Date fecha= new Date();
                    SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
                    try
                    {
                    fecha= formatoDeFecha.parse(dato.getFirstChild().getNodeValue());
                    }
                    catch(Exception e)
                    {

                    }
                    gasto.setFecha(fecha);


                }
            }
            gastos.add(gasto);
        }

        return gastos;

    }

Assets から XML ファイルを開くこの他のコードがあり、読み取りコード (getAll メソッド) で動作します。

public void abrirArchivo()
    {       
        //Cargo el archivo xml en una variable Document
        try
        {                   
        AssetManager assManager = context.getAssets();

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();    
        dom = dBuilder.parse(assManager.open("gastos.xml"));
        }
        catch (Exception e) {
            e.printStackTrace();
            }
    }

ある方法が情報の追加には機能し、読み取りには機能しない理由がわかりません。ありがとう

4

2 に答える 2

1

解決しました。コードはうまく機能していました。SdCard の XML ファイルには、fecha(date) と monto(double) の文字列値がありました。無効なレコードを削除しましたが、現在は正常に機能しています

于 2013-04-28T14:36:38.927 に答える
0

これをチェックしてください-

package com.example.playrecordedvideo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class XMLParser {
    Document docData;
    public boolean ReadXmlFile(String filePath)
    {
        try {
            String Data="";
            File fIN = new File(filePath);

            if (fIN.exists()) 
            {
                StringBuffer fileData = new StringBuffer(1000);
                BufferedReader reader = new BufferedReader(
                        new FileReader(filePath));
                char[] buf = new char[1024];
                int numRead=0;

                while((numRead=reader.read(buf)) != -1){            
                    String readData = String.valueOf(buf, 0, numRead);
                    fileData.append(readData);              
                    buf = new char[1024];
                }

                reader.close();   
                Data= fileData.toString();

            }
            else
            {

                return false;
            }

            docData = null;
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

            try 
            {           
                DocumentBuilder db = dbf.newDocumentBuilder();          
                InputSource is = new InputSource();
                is.setCharacterStream(new StringReader(Data));
                docData = db.parse(is);         
            } catch (ParserConfigurationException e) {          

                return false;
            } catch (SAXException e) {          

                return false;
            } catch (IOException e) {           

                return false;
            }
            return true;
        } catch (Exception e) {

            return false;
        }
    }

    public boolean ReadXmlData(String Data)
    {
        try {

            docData = null;
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

            try {           
                DocumentBuilder db = dbf.newDocumentBuilder();          
                InputSource is = new InputSource();
                is.setCharacterStream(new StringReader(Data));
                docData = db.parse(is);         
            } catch (ParserConfigurationException e) {          

                return false;
            } catch (SAXException e) {          

                return false;
            } catch (IOException e) {           

                return false;
            }

            return true;
        } catch (Exception e) {

            return false;
        }
    }

    public boolean WriteXml(String fileName)
    {
        try
        {
            //write original temp file

                String tempFile=fileName;

                Transformer transformer = TransformerFactory.newInstance().newTransformer();  
                transformer.setOutputProperty(OutputKeys.INDENT, "yes");            
                StreamResult result = new StreamResult(new FileWriter(tempFile));  
                DOMSource source = new DOMSource(docData);  
                transformer.transform(source, result);

            return true;
        }
        catch (Exception e) {

            return false;
        }
    }

    public void SetValue(String ColumnName,String Value)
    {
        try
        {           
            docData.getElementsByTagName(ColumnName).item(0).getFirstChild().setNodeValue(Value);
        }
        catch (Exception e) {

        }
    }

    public String GetValue(String ColumnName)
    {
        String Value="ERROR"; 

        try
        {
            Value=docData.getElementsByTagName(ColumnName).item(0).getFirstChild().getNodeValue();
        }
        catch (Exception e) {

        }
        return Value;
    }   


    public int getRowsLength()
    {
        try
        {           
            return docData.getElementsByTagName("Data").getLength();
        }
        catch (Exception e) {

        }
        return 0;
    }

    public boolean NewRow(String id,String time)
    {
        try {
            Element baseRoot; 
            baseRoot = docData.getDocumentElement(); 

            Element root = docData.createElement("Data"); 
            baseRoot.appendChild(root); 

            Element child = docData.createElement("ID"); 
            root.appendChild(child); 

            Text text = docData.createTextNode(id); 
            child.appendChild(text); 

            child = docData.createElement("TIME"); 
            root.appendChild(child);

            text = docData.createTextNode(time); 
            child.appendChild(text);            

            return true;
        } catch (Exception e) {         
            return false;
        }

    }   

    public void SetValue(String ColumnName,String Value,int index)
    {
        try
        {           
            docData.getElementsByTagName(ColumnName).item(index).getFirstChild().setNodeValue(Value);
        }
        catch (Exception e) {

        }
    }

    public String GetValue(String ColumnName,int index)
    {
        String Value="ERROR"; 
        try
        {
            Value=docData.getElementsByTagName(ColumnName).item(index).getFirstChild().getNodeValue();
        }
        catch (Exception e) {

        }
        return Value;
    }   

}
于 2013-04-28T05:28:09.203 に答える