Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Как обработать xml с помощью SAX


Автор: IUser 13.12.2007, 12:12
Есть XML файл, часть кода читается, а часть нет, вот сам файл
Код

        <clientlist>
        <client debtor="false" id="K1">
            <firstname>Андрей</firstname>
            <lastname>Григоренко</lastname>
            <phone>2445502</phone>
            <email>[email protected]</email>
            <order executed="false">
                <titles mark="HYUNDAI H 1407">
                    <title>Магнитола с CD</title>
                    <price>58</price>
                    <amont>1</amont>
                </titles>
                <titles mark="SONY NW-S 706">
                    <title>Flash плеер</title>
                    <price>322</price>
                    <amont>1</amont>
                </titles>
                <date>10.12.2007</date>
            </order>
        </client>
        <client debtor="true" id="K2">
            <firstname>Сергей</firstname>
            <lastname>Булаш</lastname>
            <phone>2314655</phone>
            <email>[email protected]</email>
            <order executed="false">
                <titles mark="VITEK VT 3796">
                    <title>Flash плеер</title>
                    <price>98</price>
                    <amont>1</amont>
                </titles>
                <date>отказался от заказа</date>
            </order>
        </client>
    </clientlist>



Добавлено через 1 минуту и 30 секунд
не могу прочитать поля titles.

Автор: AlexeyVorotnikov 13.12.2007, 12:22
А почему?
Цитата

drakogibka: постоянно вылезает ошибка что делать????????? 
support: Сейчас мы помедитируем, наш ведущий программист впадет в транс и попробует угадать текст ошибки и когда она у вас происходит.

Автор: IUser 13.12.2007, 12:36
могу выслать проект, кто может помочь

Автор: ecologist 13.12.2007, 12:48
Ну как можно без кода узнать, почему что-то не читается ? А разбираться в проекте целиком - времени жалко.
Вышли ту часть, которая читает файл.

Автор: AlexeyVorotnikov 13.12.2007, 13:03
И напишите почему же всё-таки не работает. Выкидывает ексепшн? Какой? Что говорит?  И т.д.

Автор: IUser 13.12.2007, 13:27
выслал

Автор: IUser 13.12.2007, 14:53
вот какая ошибка 

Exception in thread "main" java.lang.NullPointerException
    at shop.ShopHandler.characters(ShopHandler.java:111)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.characters(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at shop.SAXSimple.main(SAXSimple.java:37)
document started

Автор: Kangaroo 13.12.2007, 14:57
Цитата(IUser @  13.12.2007,  12:27 Найти цитируемый пост)
выслал

куда выслал?  smile  Лучше сюда выложи код ShopHandler'a, авось поможем.

Автор: IUser 13.12.2007, 15:01
Код

import org.xml.sax.Attributes;
//import org.xml.sax.ContentHandler;
import java.util.ArrayList;
import org.xml.sax.helpers.DefaultHandler;


public class ShopHandler extends DefaultHandler{
    
    ArrayList<Client> client= new ArrayList<Client>();
   Client curr = null;
    InternetShopEnam  currentEnum   = null;
    
    public ArrayList<Client>  getClient(){
    return client;
    }
    
            
    
    
    public void startDocument(){
    
        System.out.println("document started");
        
    }
    
    public void startElement(String uri, String localName, String qName, Attributes attrs){
        
     
           
     if(qName.equals("client")){
       curr = new Client(); 
       curr.setDebtor(attrs.getValue(0));      
       curr.setDebtor(attrs.getValue(1)); 
       
       
                   
       
           
       }
          
     if(!"client".equals(qName) && !"clientlist".equals(qName)
         &&!"order".equals(qName)&&!"titles".equals(qName)) {
        
            currentEnum = InternetShopEnam.valueOf(qName.toUpperCase());
            
        }
        
        }
    
    public void endElement(String uri, String localName, String qName){
    
     
     
     if(qName.equals("client")) 
     client.add(curr);
     currentEnum = null;
     
     
     
    }
    public void characters(char[] ch, int start, int length){
    
     String s = new String( ch,  start,  length).trim();
     
     
       
     if (currentEnum ==null)
         return;
       
       
      switch(currentEnum){
        
     //      case FIRSTNAME:
       //        curr.setFirstName(s);
         //      break;
            case LASTNAME:
                curr.setLastName(s);
                break;
            case  PHONE:
             curr.setPhone(s);
             break;
            case  EMAIL:
             curr.setPhone(s);
             break;
            case  ID:
             curr.setDebtor(s);
             break;
             
            case  DEBTOR:
             curr.setDebtor(s);
             break;
            case  DATE:
               curr.getOrder().setDate(s);
               break;
            case  TITLE:
             curr.getOrder().getTitles().setTitle(s);
             break;  
           
      
      }
    }
   }


высылал на адресс который появляется при нажатии на E-mail

Добавлено через 55 секунд
ошибка в последнем Case

Автор: Kangaroo 13.12.2007, 15:09
Дык теперь покажи Client )
Есть подозрение, что что-то в этой цепочке является НУЛЛем:
Код

curr.getOrder().getTitles().setTitle(s);


ЗЫ
Кроме Клиента, еще нужны Order & Title

Автор: IUser 13.12.2007, 15:35
Они являются вложенными, Title вложен в Order

Добавлено через 1 минуту и 8 секунд
и всё это вложено в клиента

Добавлено через 3 минуты и 45 секунд
вот клиент
Код

package shop;
public class Client {
    
private boolean debtor;
private String id;
private String firstname;
private String lastname;
private String phone;
private String email;
private Order order = new  Order();
 
   public Client(){
   }      
 
   public Client(boolean debtor, String id, String firstname, String lastname,String phone, String email, Order order ) {
   
        this.debtor = debtor;
        this.id = id;
        this.firstname = firstname;
        this.lastname = lastname;
        this.phone = phone;
        this.email = email;
        this.order =   order; 
    }
   
   public boolean getDebtor(){
   return debtor;
   }
   
   public void setDebtor(boolean debtor){
   this.debtor = debtor;
   }
   
   
   public String getId(){
   return id;
   }
   
   public void setDebtor(String id){
   this.id= id;
   }
   
   
   public String getFirstNane(){
   return firstname;
   }
   
   public void setFirstName(String firstname){
   this.firstname = firstname;
   }
   
   
   public String getLastName(){
   return lastname;
   }
   
   public void setLastName(String lastname){
   this.lastname = lastname;
   }
   
   
   public String getPhone(){
   return phone;
   }
   
   public void setPhone( String phone){
   this.phone = phone;
   }
   
   public String getEmail(){
   return email;
   }
   
   public void setEmail(String email){
   this.email= email;
   }
   
   
   public Order getOrder(){
   return order;
   }
   
   public void setOrder(Order order){
   this.order= order;
   }
    public static class Order{
    
    private String executed;
    private  String date;
    private  Titles title;
     public Order(){
     }
    public Order(String executed,String date,Titles title  ){
     this.executed = executed;
     this.date = date;
     this.title = title;    
    }
     
    public String getExecuted(){
        return executed;
        }
        
    public void setExecuted(String executed){
       this.executed= executed;
       }
       
        
        public String getDate(){
            return date;
            }
        public void setDate(String date){
            this.date= date;
            }
        
        public Titles getTitles(){
            return title;
            }
            
        public void setTitles(Titles title){
         this.title= title;
         }
          
    ///Вложенный класс товары
        
        public class Titles {

         private String mark;
           private String title;
           private int price;
             private int amount;
            
           public Titles(){
           }
            /** Creates a new instance of Titles */
            public Titles(String mark, String title, int price, int numbergoods, int amount ) {
            this.mark = mark;
            this.title = title;
            this.price = price;
            this.amount = amount;
             }
            public String getMark(){
                return mark;
                }
                
                public void setMark(String mark){
                this.mark = mark;
                }
                
                public String getTitle(){
                return title;
                }
                
                public void setTitle(String title){
                this.title = title;
                
            }
                
                public int getPrice(){
                return price;
                }
                
                public void setPrice(int price){
                this.price = price;
             }
                
                public int getAmount(){
                return amount;
                }
                
                public void setAmount(int amount){
                this.amount= amount;
             }
               
       }
        
            
        
    }
    
    public String toString(){
        
        return 
                "\nClient "+ "\n"+ firstname+ " "+ lastname+" "+" id: "+ id + " "+"debtor="+debtor + 
                "\n"+ phone 
                + "\n "+ email+ "\nDate "+ order.getDate()+ order.getTitles().title;
                
                
        }
}

Автор: Kangaroo 13.12.2007, 15:45
Вот:
Код

private  Titles title;    
     public Order(){    
     }

У тебя title не инициализируется. 
Нужно
Код

private  Titles title = new Titles();    
//or
     public Order(){    
         title = new Titles();
     }

Автор: AlexeyVorotnikov 13.12.2007, 15:51
Kangaroo, опередил smile

Добавлено через 1 минуту и 4 секунды
Однако, судя по коду, это был отнюдь не последний вопрос. Вопросов будет ещё много. smile

Автор: Kangaroo 13.12.2007, 15:58
Цитата(AlexeyVorotnikov @  13.12.2007,  14:51 Найти цитируемый пост)
Однако, судя по коду, это был отнюдь не последний вопрос. Вопросов будет ещё много.

Да, похоже на то smile


IUser, а почему у тебя Titles один? Может нужно сделать класс Title и список объектов этого класса titles ?

Автор: IUser 13.12.2007, 16:01
это точно, буду очень благодарен за помощь

Добавлено через 4 минуты и 7 секунд
Запустилось!!

а можно класс Titles отдельно  сделать, не вложенным, или тогда придется ещё одну коллекцию делать на Titles?

Автор: AlexeyVorotnikov 13.12.2007, 16:08
Вообще, написание хендлера для SAX парсера задача довольно нетривиальная. Без знания теории конечных автоматов, на одной интуиции, написать его правильно затруднительно. Особенно, если и о структурах  данных понятия смутные. (Шутка smile )

Автор: IUser 13.12.2007, 16:14
Да я только учусь, по этому смутное понятие обо всём( smile )

Добавлено через 1 минуту и 4 секунды
а это я пишу по примеру, сказали так писать, только пример упращён

Автор: Kangaroo 13.12.2007, 16:16
Цитата(AlexeyVorotnikov @  13.12.2007,  15:08 Найти цитируемый пост)
 Без знания теории конечных автоматов

Это как  smile  Что-то смутно помнится с первых курсов..
Или это 
Цитата(AlexeyVorotnikov @  13.12.2007,  15:08 Найти цитируемый пост)
(Шутка  )
 ?

Автор: AlexeyVorotnikov 13.12.2007, 16:21
В каждой шутке есть доля шутки smile
Сейчас я попробую подправить программу и покажу, что получилось.

Автор: Kangaroo 13.12.2007, 16:29
А у меня как? UserHandler из лабы моей по СаксПарсеру:
Код

public class UsersHandler extends DefaultHandler {
    
    public enum CurrentElement {
        LOGIN,
        PASSWORD,
        NAME,
        SURNAME,
        LAST_LOGIN_DATE,
        SHOW_NEWS,
        SHOW_CALENDAR,
        NO_ELEMENT
    }
    private static final List<String> elements = new ArrayList<String>(Arrays.asList("user", "login", "pass", "name", 
            "surname", "lastLoginDate", "showNews", "showCalendar")); 
    private static List<User> users;
    private CurrentElement currentElement;
    private int elementIndex;
    private User user;
    

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if (qName.equals("user")) {
            users.add(user);
            user = null;
        }
    }


    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        elementIndex = elements.indexOf(qName);
        switch (elementIndex) {
            case 0: { //user
                user = new User();
                if (attributes != null) {
                    user.setGroup(attributes.getValue("group"));
                }
                break;
            }
            case 1: { //login
                currentElement = CurrentElement.LOGIN;
                break;
            }
            case 2: { //pass
                currentElement = CurrentElement.PASSWORD;
                if (attributes != null) {
                    user.setEncryptionAlgorithm(attributes.getValue("enc"));
                }
                break;
            }
            case 3: { //name
                currentElement = CurrentElement.NAME;
                break;
            }
            case 4: { //surname
                currentElement = CurrentElement.SURNAME;
                break;
            }            
            case 5: { //last login date
                currentElement = CurrentElement.LAST_LOGIN_DATE;
                break;
            }
            case 6: { //show news
                currentElement = CurrentElement.SHOW_NEWS;
                break;
            }
            case 7: { //show calendar
                currentElement = CurrentElement.SHOW_CALENDAR;
                break;
            }
            default: {
                //nothing to do
            }            
        }
    }
    
    public void characters(char[] buf, int offset, int len) throws SAXException {
        SimpleDateFormat  simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.UK);
        String valueString = new String(buf, offset, len);
        switch (currentElement) {
         case LOGIN: {
             user.setLogin(valueString);
             break;
         }
         case PASSWORD: {
             user.setPassword(valueString);
             break;
         }
         case NAME: {
             user.setName(valueString);
             break;
         }
         case SURNAME: {
             user.setSurname(valueString);
             break;
         }
         case LAST_LOGIN_DATE: {
             try {
                    user.setLastLoginDate(simpleDateFormat.parse(valueString));
                } catch (ParseException e) {
                    //bad date
                }
             break;
         }
         case SHOW_NEWS: {
             user.setShowNews(valueString);
             break;
         }
         case SHOW_CALENDAR: {
             user.setShowCalendar(valueString);
             break;
         }
        }
    }
}


Автор: IUser 13.12.2007, 17:22
что делает строка

private static final List<String> elements = new ArrayList<String>(Arrays.asList("user", "login", "pass", "name",    
            "surname", "lastLoginDate", "showNews", "showCalendar")); 

Автор: Kangaroo 13.12.2007, 17:34
В startElement:
Код

elementIndex = elements.indexOf(qName);    
switch (elementIndex) {
...
}         

Чтобы использовать свитч для определения текущего нода. Иначе пришлось бы кучу if'ов писать.

Автор: IUser 14.12.2007, 15:57
что может означать ошибка
[Fatal Error] Internet.xml:2:3: The markup in the document preceding the root element must be well-formed.
org.xml.sax.SAXParseException: The markup in the document preceding the root element must be well-formed.
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at nshop.SAXSimple.main(SAXSimple.java:24)
document started
 Ошибка SAX-парсера

Автор: Kangaroo 14.12.2007, 16:20
IUser, а покажи Internet.xml Что-то в нем не well-formed

Автор: IUser 14.12.2007, 17:35
xml исправил, теперь вот что выдает

Exception in thread "main" java.lang.NullPointerException
    at nshop.ShopHandler.characters(ShopHandler.java:114)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.characters(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at nshop.SAXSimple.main(SAXSimple.java:24)

Автор: Kangaroo 14.12.2007, 17:50
Найди строчку:
Цитата

at nshop.ShopHandler.characters(ShopHandler.java:114)

Там у тебя где-то опять null pointer выскакивает...

Автор: IUser 14.12.2007, 18:09
из за чего это бывает?

Автор: Kangaroo 14.12.2007, 18:24
IUser, 
ну как это из-за чего. Обьект какой-нибудь у тебя null, а ты пытаешься вызвать метод его.

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

Object o = null;
o.toString(); //NullPointerException

Автор: Orange 8.5.2008, 14:38
И вот это не понятно, зачем два раза подряд set

Код

if(qName.equals("client")){
       curr = new Client(); 
       curr.setDebtor(attrs.getValue(0));      
       curr.setDebtor(attrs.getValue(1)); 
  }


Добавлено через 6 минут и 26 секунд
Ооой! Я про SAX примеры искал и чего-то зачитался, на дату поста не посмотрел)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)