如何从SD卡读取XML文件?

时间:2022-09-19 09:00:38

I want to parse an XML file from an SD card on Android, and I have to show the result in list view format. I tried to do it with this code:

我想从Android上的SD卡解析XML文件,我必须以列表视图格式显示结果。我尝试用这段代码做到这一点:

for (int i = 0; i < obj_nod_list.getLength(); i++) {
    Node list = obj_nod_list.item(i); String strText =
        list.getFirstChild().getNodeValue();

but it results in a org.apache.harmony.xml.dom.ElementImpl exception. What am I doing wrong?

但它会导致org.apache.harmony.xml.dom.ElementImpl异常。我究竟做错了什么?

2 个解决方案

#1


0  

check here,
http://groups.google.com/group/android-developers/browse_thread/thread/87d7305179d75985

点击此处,http://groups.google.com/group/android-developers/browse_thread/thread/87d7305179d75985

#2


0  

Here is my XML Parser:

这是我的XML Parser:

public class XMLReaderMarca extends DefaultHandler {
private static String TAG = "TAG";

/** Buffer que guarda as informações quando um texto é encontrado */
private StringBuffer valorAtual = new StringBuffer();

/** Lista que possui os objetos do arquivo XML */
private ArrayList<Marca> lista = new ArrayList<Marca>();

// private ArrayList<Produto> lista;

public ArrayList<Marca> getLista() {
    return lista;
}

/** apenas para coletar as informações do XML */
private Marca objetoTemp;

/**
 * Constutor que inicializa os objetos necessários para fazer o parse do
 * arquivo xml
 */
public void parse(String _caminho) {
    try {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser parser = spf.newSAXParser();

        File file = new File(_caminho);

        Log.i(TAG, " -- Inicio do XMLReaderMarca.parse --");
        parser.parse(file, this);
        Log.i(TAG, " -- Fim do XMLReaderMarca.parse --");

        file.delete();

    } catch (ParserConfigurationException e) {
        Log.i(TAG,
                "XMLReaderMarca.parse: O parser não foi configurado corretamente.");
    } catch (SAXException e) {
        Log.i(TAG,
                "XMLReaderMarca.parse: Problema ao fazer o parse do arquivo.");
    } catch (IOException e) {
        Log.i(TAG, "XMLReaderMarca.parse: O arquivo não pode ser lido.");
    }
}

/**
 * Indica que o parser achou o início do documento XML. Este evento não lhe
 * passa qualquer informação, apenas indica que o parser vai começar a
 * escanear o arquivo XML.
 */
public void startDocument() {
    Log.i(TAG, "Iniciando a leitura do XML em XMLReaderMarca");
}

/**
 * Indica que o parser achou e fim do documento XML.
 */
public void endDocument() {
    Log.i(TAG, "Finalizou a leitura do XML em XMLReaderMarca");
}

/**
 * Indica que o parser achou o início de uma tag (tag de abertura/início).
 * Este evento fornece o nome do elemento, o nome e valor dos atributos
 * deste elemento, e também pode fornecer as informações sobre o namespace.
 */
public void startElement(String uri, String localName, String tag,
        Attributes atributos) {

    valorAtual.setLength(0);

    if (tag.equalsIgnoreCase("Marca")) {
        objetoTemp = new Marca();
    }
    /*
     * //se o elemento possui atributos, imprime for (int i=0; i<
     * atributos.getLength(); i++){ if
     * (atributos.getQName(i).equalsIgnoreCase(ATT_ID)){
     * contatoTemp.setId(Integer.parseInt(atributos.getValue(i))); } else if
     * (atributos.getQName(i).equalsIgnoreCase(ATT_GRAVADO)){
     * contatoTemp.setGravado(atributos.getValue(i)); } }
     */
}

/**
 * Indica que o parser achou o fim de uma tag/elemento. Este evento fornece
 * o nome do elemento, e também pode fornecer as informações sobre o
 * namespace.
 */
public void endElement(String uri, String localName, String tag) {

    // adiciona o objeto na lista
    if (tag.equalsIgnoreCase("Marca")) {
        lista.add(objetoTemp);
    }
    // senão, seta os atributos
    else if (tag.equalsIgnoreCase(Marca.TAGS[0])) {
        objetoTemp.setCd_marca(validaStringInteger(valorAtual.toString()));
    } else if (tag.equalsIgnoreCase(Marca.TAGS[1])) {
        objetoTemp.setDs_marca(valorAtual.toString());
    }

    // limpa o valor Atual
    valorAtual.delete(0, valorAtual.length());
}

/**
 * Indica que o parser achou algum Texto (Informação).
 */
public void characters(char[] ch, int start, int length) {
    valorAtual.append(ch, start, length);
}

private Integer validaStringInteger(String string) {
    return isDigit(string) ? Integer.valueOf(string) : 0;
}

private Double validaStringDouble(String string) {
    return Double.valueOf(string);
}

boolean isDigit(String s) {
    return s.matches("[0-9]*");
}
}

My "TAGs" are the field's name, with this you don't need any external libs.

我的“标签”是该字段的名称,您不需要任何外部库。

Sorry, but the code's comments is in Portuguese (Brazil), I can't translate right now, sorry :(

对不起,但代码的评论是葡萄牙语(巴西),我现在无法翻译,对不起:(

[]'s Bertan

#1


0  

check here,
http://groups.google.com/group/android-developers/browse_thread/thread/87d7305179d75985

点击此处,http://groups.google.com/group/android-developers/browse_thread/thread/87d7305179d75985

#2


0  

Here is my XML Parser:

这是我的XML Parser:

public class XMLReaderMarca extends DefaultHandler {
private static String TAG = "TAG";

/** Buffer que guarda as informações quando um texto é encontrado */
private StringBuffer valorAtual = new StringBuffer();

/** Lista que possui os objetos do arquivo XML */
private ArrayList<Marca> lista = new ArrayList<Marca>();

// private ArrayList<Produto> lista;

public ArrayList<Marca> getLista() {
    return lista;
}

/** apenas para coletar as informações do XML */
private Marca objetoTemp;

/**
 * Constutor que inicializa os objetos necessários para fazer o parse do
 * arquivo xml
 */
public void parse(String _caminho) {
    try {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser parser = spf.newSAXParser();

        File file = new File(_caminho);

        Log.i(TAG, " -- Inicio do XMLReaderMarca.parse --");
        parser.parse(file, this);
        Log.i(TAG, " -- Fim do XMLReaderMarca.parse --");

        file.delete();

    } catch (ParserConfigurationException e) {
        Log.i(TAG,
                "XMLReaderMarca.parse: O parser não foi configurado corretamente.");
    } catch (SAXException e) {
        Log.i(TAG,
                "XMLReaderMarca.parse: Problema ao fazer o parse do arquivo.");
    } catch (IOException e) {
        Log.i(TAG, "XMLReaderMarca.parse: O arquivo não pode ser lido.");
    }
}

/**
 * Indica que o parser achou o início do documento XML. Este evento não lhe
 * passa qualquer informação, apenas indica que o parser vai começar a
 * escanear o arquivo XML.
 */
public void startDocument() {
    Log.i(TAG, "Iniciando a leitura do XML em XMLReaderMarca");
}

/**
 * Indica que o parser achou e fim do documento XML.
 */
public void endDocument() {
    Log.i(TAG, "Finalizou a leitura do XML em XMLReaderMarca");
}

/**
 * Indica que o parser achou o início de uma tag (tag de abertura/início).
 * Este evento fornece o nome do elemento, o nome e valor dos atributos
 * deste elemento, e também pode fornecer as informações sobre o namespace.
 */
public void startElement(String uri, String localName, String tag,
        Attributes atributos) {

    valorAtual.setLength(0);

    if (tag.equalsIgnoreCase("Marca")) {
        objetoTemp = new Marca();
    }
    /*
     * //se o elemento possui atributos, imprime for (int i=0; i<
     * atributos.getLength(); i++){ if
     * (atributos.getQName(i).equalsIgnoreCase(ATT_ID)){
     * contatoTemp.setId(Integer.parseInt(atributos.getValue(i))); } else if
     * (atributos.getQName(i).equalsIgnoreCase(ATT_GRAVADO)){
     * contatoTemp.setGravado(atributos.getValue(i)); } }
     */
}

/**
 * Indica que o parser achou o fim de uma tag/elemento. Este evento fornece
 * o nome do elemento, e também pode fornecer as informações sobre o
 * namespace.
 */
public void endElement(String uri, String localName, String tag) {

    // adiciona o objeto na lista
    if (tag.equalsIgnoreCase("Marca")) {
        lista.add(objetoTemp);
    }
    // senão, seta os atributos
    else if (tag.equalsIgnoreCase(Marca.TAGS[0])) {
        objetoTemp.setCd_marca(validaStringInteger(valorAtual.toString()));
    } else if (tag.equalsIgnoreCase(Marca.TAGS[1])) {
        objetoTemp.setDs_marca(valorAtual.toString());
    }

    // limpa o valor Atual
    valorAtual.delete(0, valorAtual.length());
}

/**
 * Indica que o parser achou algum Texto (Informação).
 */
public void characters(char[] ch, int start, int length) {
    valorAtual.append(ch, start, length);
}

private Integer validaStringInteger(String string) {
    return isDigit(string) ? Integer.valueOf(string) : 0;
}

private Double validaStringDouble(String string) {
    return Double.valueOf(string);
}

boolean isDigit(String s) {
    return s.matches("[0-9]*");
}
}

My "TAGs" are the field's name, with this you don't need any external libs.

我的“标签”是该字段的名称,您不需要任何外部库。

Sorry, but the code's comments is in Portuguese (Brazil), I can't translate right now, sorry :(

对不起,但代码的评论是葡萄牙语(巴西),我现在无法翻译,对不起:(

[]'s Bertan