Проблема с парсингом xml

Ответить
Аватара пользователя
MeTeOpA
Сообщения: 85
Зарегистрирован: 07 мар 2012, 12:50

Проблема с парсингом xml

Сообщение MeTeOpA » 11 май 2012, 12:11

Вообщем штука такая....
Есть файл xml :

Код: Выделить всё

?xml version="1.0" encoding="utf-8"?>
<array>
    <city id="City1">
        <category id="FirstCategory">
           <subcategory id="FirstSubCategory"></subcategory>
           <subcategory id="SecondSubCategory"></subcategory>
           <subcategory id="ThirdSubCategory"></subcategory>
        </category>
        <category id="SecondCategory">
           <subcategory id="FirstSubCategory"></subcategory>
           <subcategory id="SecondSubCategory"></subcategory>
           <subcategory id="ThirdSubCategory"></subcategory>
        </category>        
        <category id="ThirdCategory">
           <subcategory id="FirstSubCategory"></subcategory>
           <subcategory id="SecondSubCategory"></subcategory>
           <subcategory id="ThirdSubCategory"></subcategory>
        </category>    
    </city>
        <city id="City2">
        ...
        ...
      </city>
</array>
В нем как вы видите 3 части : Города, категории и подкатегории.
Делаю парсинг с помощью Sax в отдельном классе

Код: Выделить всё

package com.android.cityviewer;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;
 
public class CategoriesParser {
	public static RootArray top;
	public static CityArray c;
	public static CategoryArray categoria;
	public static SubArray sub;
	public static boolean flag;

	
public static void PrintAll() {
    	System.out.println(top.getRoot());
    	for (int i=0;i<top.getChildCount();i++)
    	{
    		System.out.println(top.getChildAt(i));
    		for(int j=0;j<top.cities.size();j++)
    		{
    			System.out.println("   "+top.cities.get(i).cat.get(j).name);
    			
        		for(int q=0;q<top.cities.get(i).cat.size();q++)
        		{
        			System.out.println("      "+top.cities.get(i).cat.get(j).subs.get(q).name);
        			
        		}
    		}
   
    	}
		
}
protected static int i=0;
protected static int j=0;
public static void parsing(String string) {
 
    try {
    	


	SAXParserFactory factory = SAXParserFactory.newInstance();
	SAXParser saxParser = factory.newSAXParser();
 
	DefaultHandler handler = new DefaultHandler() {
 

	public void startDocument()
	{
    	//top = new DefaultMutableTreeNode("Root");
		top = new RootArray("Root");
	} 
 
	public void startElement(String uri, String localName,String qName, 
                Attributes attr) throws SAXException {
		
    if (qName.equals("city")){
    	c= new CityArray(attr.getValue("id"));
    	top.cities.add(c);
    	flag = false;
    }
    if (qName.equals("category")){
    	categoria = new CategoryArray(attr.getValue("id"));
    	top.cities.get(i).cat.add(categoria);
    	flag = false;
    }
    if (qName.equals("subcategory")){
    	sub = new SubArray(attr.getValue("id"));
    	top.cities.get(i).cat.get(j).subs.add(sub);
    	flag = false;
     }
	}
 
	public void endElement(String uri, String localName,
		String qName) throws SAXException {
	    if (qName.equals("city")){
	    	i++;
	    	j=0;
	    	c=null;
	    }
	    if (qName.equals("category")){
	    	j++;
	    	categoria = null;
	    }
	   		    if (qName.equals("array")){
		  PrintAll();
		        }
	}
	

	public void characters(char ch[], int start, int length) throws SAXException {}
 
     };
     
     	flag = true;
     	saxParser.parse(string, handler);
     	if(!flag)
     	{
     		Log.d("CityViewerLog", flag+" = flag");
     	}
       
     } catch (Exception e) {
       e.printStackTrace();
     }

    
    
   }

 
}
На вход методу parse передаю "res/xml/file.xml"
Классы Root,City,Category,Sub содержат шаблон(на примере RootArray)

Код: Выделить всё

package com.android.cityviewer;
import java.util.Vector;


public class RootArray {

	String name;
	Vector<CityArray> cities = new Vector<CityArray>();
	RootArray(String value)
	{
		this.name=value;
	}
	public void add(CityArray city)
	{
		cities.addElement(city);
	}
	public String getRoot() {
		// TODO Auto-generated method stub
		return this.name;
	}
	public int getChildCount() {
		// TODO Auto-generated method stub
		return cities.size();
	}
	public String getChildAt(int i) {
		// TODO Auto-generated method stub
		return (cities.get(i).name);
	}
}

Проблема собственно заключается вот в чем. Заполняет только верхний узел (top="Root")
Дальше парсинг не идет.
В чем ошибка и как её устранить?
P.S. Насколько я понимаю, при сборке проекта, файлы которые лежат не в res/values/ не будут компилится... Я к сожалению не знаю как билдится проект,и какие файлы включаются при сборке в apk.

Аватара пользователя
MeTeOpA
Сообщения: 85
Зарегистрирован: 07 мар 2012, 12:50

Re: Проблема с парсингом xml

Сообщение MeTeOpA » 11 май 2012, 12:12

Собственно пытался сделать что то вроде DefaultMutableTreeNode Но вижу что намудрил а где не могу понять)

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Проблема с парсингом xml

Сообщение damager82 » 12 май 2012, 11:13

MeTeOpA писал(а):Собственно пытался сделать что то вроде DefaultMutableTreeNode Но вижу что намудрил а где не могу понять)
А что вы передаете в метод CategoriesParser.parsing? XML-строку? Так работать не будет.
Метод public void parse(String uri, DefaultHandler dh) ждет на вход не XML, а URI.

Используйте другие методы: http://docs.oracle.com/javase/6/docs/ap ... od_summary

Вы можете кинуть ваш файл в папку assets. В этом случае файл попадет в apk.
А прочесть его можно так:
getAssets().open("file.xml")

Этот метод возвращает InputStream, и его как раз можно использовать в одной из реализаций метода parse.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
MeTeOpA
Сообщения: 85
Зарегистрирован: 07 мар 2012, 12:50

Re: Проблема с парсингом xml

Сообщение MeTeOpA » 16 май 2012, 01:38

Уже решил проблему. Использую XML pull Parser

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Проблема с парсингом xml

Сообщение damager82 » 16 май 2012, 09:48

MeTeOpA писал(а):Уже решил проблему. Использую XML pull Parser
Как раз завтра урок об этом )
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Ответить