Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XML&SAX parse, помогити написать оброботчик xml-файла 
:(
    Опции темы
celt11
  Дата 9.4.2009, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.3.2009

Репутация: нет
Всего: нет



Здраствуйте!


Помогите мне написать обработчик для даного файла
Код

<?xml version="1.0" ?>
<MMWEATHER>
 <REPORT type="frc3">
  <TOWN index="27612" sname="%CC%EE%F1%EA%E2%E0" latitude="56" longitude="38">
    <FORECAST day="10" month="3" year="2009" hour="9" tod="1" predict="18" weekday="3">
     <PHENOMENA cloudiness="3" precipitation="6" rpower="0" spower="0"/>
     <PRESSURE max="737" min="735"/>
     <TEMPERATURE max="0" min="-2"/>
     <WIND min="2" max="5" direction="3"/>
     <RELWET max="99" min="94"/>
     <HEAT min="-5" max="-3"/>
    </FORECAST>
    <FORECAST day="10" month="3" year="2009" hour="15" tod="2" predict="24" weekday="3">
     <PHENOMENA cloudiness="3" precipitation="6" rpower="0" spower="0"/>
     <PRESSURE max="736" min="734"/>
     <TEMPERATURE max="2" min="0"/>
     <WIND min="2" max="5" direction="3"/>
     <RELWET max="99" min="94"/>
     <HEAT min="-3" max="-1"/>
    </FORECAST>
    <FORECAST day="10" month="3" year="2009" hour="21" tod="3" predict="30" weekday="3">
     <PHENOMENA cloudiness="3" precipitation="6" rpower="0" spower="0"/>
     <PRESSURE max="737" min="735"/>
     <TEMPERATURE max="1" min="-1"/>
     <WIND min="1" max="3" direction="4"/>
     <RELWET max="98" min="93"/>
     <HEAT min="-3" max="-1"/>
    </FORECAST>
    <FORECAST day="11" month="3" year="2009" hour="3" tod="0" predict="36" weekday="4">
     <PHENOMENA cloudiness="3" precipitation="6" rpower="0" spower="0"/>
     <PRESSURE max="738" min="736"/>
     <TEMPERATURE max="0" min="-2"/>
     <WIND min="2" max="5" direction="6"/>
     <RELWET max="98" min="93"/>
     <HEAT min="-5" max="-3"/>
    </FORECAST>
  </TOWN>
 </REPORT>
</MMWEATHER>

Я сделал класс FORECAST с полями типа String(куда хочу записать атрибуты) day,month,year,hour,tod, predict,weekday и поля пользовательских типов PHENOMENA, PRESSURE, TEMPERATURE, WIND,RELWET,HEAT( которые в свою очередь содержат в полях типа String атрибуты соответствующих тэгов из xml).
Как мне правильно реализовать методы класса DefaultHandler?


Заранее спасибо smile 
PM MAIL   Вверх
4EJIOBEK
Дата 9.4.2009, 16:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 26.3.2007

Репутация: нет
Всего: 4



Класс описывающий произвольный елемент с хмл:
Код

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class Element {
    private String name = null;
    private HashMap<String,String> attributes = null;
    private List<Element> subElements = null;
    private String content = "";
    private final int nesting;

    public Element(String name,int nesting) {
        this.name = name;
        this.nesting = nesting;
    }
    
    public void setContent(String content){
        if (content==null || getTextFromString(content).length()==0) return; 
        this.content = getTextFromString(content); 
    }
    
    public void addContent(String content){
        if (content==null || getTextFromString(content).length()==0) return; 
            
        if (this.content==null || this.content.equals("")) 
            this.content = getTextFromString(content);
        else    
            this.content = this.content + getTextFromString(content);
    }
    
    public HashMap<String,String> getAttributes(){
        if (attributes == null){
            attributes = new HashMap<String, String>();
        }
        return attributes;
    }
    
    public List<Element> getElements(){
        if (subElements == null){
            subElements = new ArrayList<Element>();
        }
        return subElements;
    }
    
    public void addElement(Element element){
        getElements().add(element);
    }
    
    public void addElements(List<Element> elements){
        getElements().addAll(elements);
    }
    
    public void addAttribute(String atName,String atValue){
        getAttributes().put(atName, atValue);
    }
    
    public void addAttributes(HashMap<String,String> attributes){
        getAttributes().putAll(attributes);
    }    
    
    public String getName(){
        return name;
    }
    
    public String getContent(){
        return content;
    }
    
    public String toString(){
        return tabs()+"<"+getName()+" "+getAttributeList()+">"+
            (getContent().length()>0 ? "\n\t"+tabs()+getContent():"")+
            getElementsList()+
            "\n"+tabs()+"</"+getName()+">";
    }
    
    private String getElementsList(){
        StringBuilder sb = new StringBuilder();
        for (Element elem: getElements()){
            sb.append("\n"+elem);
        }
        return sb.toString();
    }
    
    private String getAttributeList(){
        StringBuilder sb = new StringBuilder();
        try{
            Set<String> set = getAttributes().keySet();
            Iterator<String> iter = set.iterator();
            while (iter.hasNext()){
                String tKey = iter.next();
                if (sb.length()==0)
                    sb.append(tKey+"=\""+getAttributes().get(tKey)+"\"");
                else 
                    sb.append(" "+tKey+"=\""+getAttributes().get(tKey)+"\"");
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return sb.toString();
    }
    
    private String tabs(){
        StringBuilder sb = new StringBuilder();
        for (int i =0;i<nesting;i++){
            sb.append("\t");
        }
        return sb.toString();
            
    }
    
    private String getTextFromString(String text){
        StringBuilder sb = new StringBuilder(text);
        if (sb.length()>0){
            while (sb.length()>0 && (sb.charAt(0)=='\n' || sb.charAt(0)=='\r' || sb.charAt(0)=='\t')){
                sb.deleteCharAt(0);
            }
            while (sb.length()>0 && (sb.charAt(sb.length()-1)=='\n' || sb.charAt(sb.length()-1)=='\r' || sb.charAt(sb.length()-1)=='\t')){
                sb.deleteCharAt(sb.length()-1);
            }
        }
        return sb.toString();
    }
    
    public List<Element> getElements(String name){
        return getElements(name,0);
    }
    
    public List<Element> getElements(String name,int afterInd){
        List<Element> list =getElements();
        List<Element> newList =new ArrayList<Element>();
        
        if (list.size()==0) return null;
        if (afterInd<0 || afterInd>=list.size()) throw new IndexOutOfBoundsException("Index "+afterInd+" is out of bound("+(list.size()-1)+")");
        for (int i = afterInd; i<list.size();i++){
            if (list.get(i).getName().equals(name)) newList.add(list.get(i));
        }
        
        return newList;
    }
    
    public Element getElement(String name){
        return getElement(name,0);
    }
    
    public Element getElement(String name,int afterInd){
        List<Element> list = getElements();
        if (list.size()==0) return null;
        if (afterInd<0 || afterInd>=list.size()) throw new IndexOutOfBoundsException("Index "+afterInd+" is out of bound("+(list.size()-1)+")");
        for (int i = afterInd; i<list.size();i++){
            if (list.get(i).getName().equals(name)) return list.get(i);
        }
        return null;
    }
}



Парсер:
Код

import java.util.ArrayList;
import java.util.List;

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

public class SAXHandler extends DefaultHandler
{
    
      private List<Element> elements=null;
      private int nesting;
      private String elementName = null;
      
      public SAXHandler(String elementName) throws Exception {
          if (elementName==null || elementName.length()<1) throw new Exception("Element name not specified!");
          this.elementName = elementName;
          nesting = -1;
          
      }
      
      public List<Element> getElements(){
          if (elements==null){
              elements = new ArrayList<Element>();
          }
          return elements;
      }
      
      @Override
      public void startDocument() throws SAXException
      {
          elements = new ArrayList<Element>();
      }
      @Override
      public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
      {
          if (nesting == -1){
              if (elementName.equals(qName)){
                  Element tElem = new Element(qName,nesting+1);
                  addAttributesToElement(tElem, attributes);
                  getElements().add(tElem);
                  nesting++;
              }
          }
          else {
              try {
                  Element tElem = new Element(qName,nesting+1);
                  addAttributesToElement(tElem, attributes);
                  getElementFor(nesting).addElement(tElem);
                  nesting++;
              } catch (Exception e) { }
          }
      }
      @Override
      public void characters(char[] ch, int start, int length) throws SAXException
      {
          if (nesting==-1) return;
          Element curr = null;
          try {
            curr = getElementFor(nesting);
        } catch (Exception e) {
            e.printStackTrace();
        }
          if(curr!=null){
              curr.addContent(new String(ch, start, length));
          }
              
      }

      @Override
      public void endElement(String uri, String localName, String qName) throws SAXException
      {
          if (nesting!=-1)
              --nesting;
      }
      
      private Element getLast(){
          List<Element> list = getElements();
          if (list.size()>0){
            return list.get(list.size()-1);  
          }
          return null;
      }
      
      private Element getElementFor(int nestingLevel) throws Exception{
          if (nestingLevel<0 && nestingLevel>this.nesting) throw new Exception("Incorect nesting level "+nestingLevel+" of "+this.nesting);
          Element curr = getLast();
          
          while (nestingLevel>0){
              curr = getLastSubElement(curr);
              nestingLevel--;
          }
          return curr;
      }
      
      private Element getLastSubElement(Element parent){
          if (parent!=null) {
              List<Element> subElements = parent.getElements();
              if (subElements.size()>0) return subElements.get(subElements.size()-1);
          }
          return null;
      }
      
      private void addAttributesToElement(Element elem, Attributes attributes){
          int count = attributes.getLength();
          for (int i=0;i<count;i++){
              elem.addAttribute(attributes.getQName(i), attributes.getValue(i));
          }
      }
}



Пример парсинга:
Код

                String s = <твой хмл>
        InputStream in = new ByteArrayInputStream(s.getBytes("UTF-8"));
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser=null;
        try {
            parser = factory.newSAXParser();
        } catch (Exception e) {
            throw e;
        }
        SAXHandler handler;
        try {
            handler = new SAXHandler("FORECAST");
            parser.parse(in, handler);
            List<Element> agr = handler.getElements())
                } catch (Exception e){}


Цитата

Я сделал класс FORECAST с полями типа String(куда хочу записать атрибуты) day,month,year,hour,tod, predict,weekday и поля пользовательских типов PHENOMENA, PRESSURE, TEMPERATURE, WIND,RELWET,HEAT( которые в свою очередь содержат в полях типа String атрибуты соответствующих тэгов из xml).


Можешь реализовать свои классы описывающие елементы таким образом, чтоб в конструктор передавалась ссылка на Element, и в конструкторе инициализировать необходимые поля.

Например:
Код

public class Forecast{
    private String day;
    private String month;
    private String year;
    ...................................
    
    private Phenomena phenomena = null;
    
    public Forecast(Element element) throws Exception{
        day=element.getAttributes().get("day");
        if (day== null)    throw new Exception("can't parse day");

        month=element.getAttributes().get("month");
        if (month == null)    throw new Exception("can't parse month");

        ....................................
        
        phenomena = new Phenomena (element.getElement("PHENOMENA"));
        ...................................

    }

    public String getDay() {
        return day;
    }

    public String getMonth() {
        return month;
    }
    ........................
    public Phenomena getPhenomena(){
        return phenomena;
    }
    
}




Это сообщение отредактировал(а) 4EJIOBEK - 24.4.2009, 10:11
PM MAIL ICQ   Вверх
celt11
Дата 9.4.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 3.3.2009

Репутация: нет
Всего: нет



спасибо за советы)) сейчас попробую!
PM MAIL   Вверх
repon
Дата 8.12.2009, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.6.2006

Репутация: нет
Всего: нет



а у меня большая XML-ка..

Код

handler.getelements().get(0).getelement("ххх").getAttributes()


возвращает разное кол-во атрибутов...
Код

{DTREG=23.01.2004, IDREG=304641502300051, DTZAP=23.01.2004, REGNUM=304641502300051}

как из получить по одному? не очень понял)


и 
Код

handler.getelements().get(0).getelement("yyy")

handler.getelements().get(0). имеет несколько элементов getelement("yyy"), т.е.
а при выводе выводит первый. как получить остальные?)

Это сообщение отредактировал(а) repon - 8.12.2009, 11:04
PM MAIL   Вверх
repon
Дата 9.12.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 12.6.2006

Репутация: нет
Всего: нет



ап... 

Код

...getAttributes().put("NAME",null)


что, только так можнО?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.