我想从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();
但会导致org.apache.harmony.xml.dom.ElementImpl
异常。我做错了什么?
答案 0 :(得分:0)
答案 1 :(得分:0)
这是我的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]*");
}
}
我的“TAG”是该字段的名称,您不需要任何外部库。
很抱歉,但代码的评论是葡萄牙语(巴西),我现在无法翻译,抱歉:(
[]的 Bertan