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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблемы с sax парсером, некоторые элементы обрезаются =( 
:(
    Опции темы
clanda
Дата 22.8.2008, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



есть хмл-ка с описанем элементов порядка 300-400 кб

Код

<?xml version="1.0" encoding="windows-1251"?>
<mnemo version="1.0" timeCreate="22.08.2008 13:57:00">
....
    <object type="Bitmap">
        <name>Bitmap183</name>
        <PicFileName>Bitmap183.jpg</PicFileName>
        <HorizontalPosition> 1</HorizontalPosition>
        <VerticalPosition> 1</VerticalPosition>
        <Width> 1021</Width>
        <Height> 768</Height>
    </object>
....
</mnemo>


проблема в том, что иногда свойства <Width> или <Height> или еще какие (эти просто более заметны)
принимают значение меньше указанных, как будто обрезается несколько знаков (вместо 1021 приходит 10 или 1 или 102)
такая вот проблемка.

парсер:

Код


import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Stack;

import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXParseException;



public class XMLRder {
    public ArrayList ObjectVector=new ArrayList(5);

    public XMLRder(String path) {
        makeDoc(path);
    }

    private void makeDoc(String path){
        XMLReader reader = null;
        try {
            reader = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
            XHandler Handler= new XHandler(this);
            reader.setContentHandler(Handler);
            reader.setErrorHandler(Handler);
            reader.parse(path);
        } catch (SAXException e) {
            System.out.println("ошибка парсера ="+e);
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("ошибка парсера ="+e);
            e.printStackTrace();
        }
    }
    
    
}

/**
 * собственно сам разбор происходит здесь
 * реализуем интерффейсы ContentHandler, ErrorHandler
 * @author clanda
 */
class XHandler implements ContentHandler, ErrorHandler{
    private String Par="",Val="";
    private Hashtable atr=new Hashtable();
    private XMLObject CurrentElement= new XMLObject(),Element= new XMLObject(),SubElement= new XMLObject();
    private Stack ObjectStack=new Stack();
    private int type=1;
    private XMLRder XmlReader;
    
    public XHandler(){
        
    }

    public XHandler(XMLRder Xreader){
        XmlReader = Xreader;
    }
    
    /**
     * док начался
     */
    public void startDocument(){
//        System.out.println("начали парсить");
        XmlReader.ObjectVector.add(Element);//добавляем элемент
    }

    /**
     * новый элемент - сразу присваиваем ему имя и аттрибуты
     */
    public void startElement(String uri, String localName, String qName, Attributes attributes){
        atr.clear();
        for (int i=0; i<attributes.getLength(); i++){
//            if (attributes.getValue(i).equals("CommandButton")){
//                System.out.print("");
//            }
            atr.put(attributes.getQName(i), attributes.getValue(i));    
        }
        Par=qName;
        Val="";
        switch (type){
        case 1: //если эементов нет, то присваиваем значения главному
            CurrentElement=Element;
            break;
        case 2:    //если элементов вагон и тележка, то заполняем их, и закидываем в вектор вышестоящего элемента
            SubElement = new XMLObject();
            CurrentElement.Elements.add(SubElement);
            CurrentElement=SubElement;
            break;
        }
        CurrentElement.Name=Par;
        CurrentElement.atrib=new Hashtable(atr);

        ObjectStack.push(CurrentElement);    
    }
    
    /**
     * элемент закрылся - вытаскиваем из стека его, и 
     * ссылаемся на вышестоящий, если есть такой...
     */
    public void endElement(String uri, String localName, String qName){
        if (qName.equals(Element.Name)){
            type=1;    //работаем с новым элементом
            ObjectStack.pop();
        } else {
            type=2;    //будем добавлять к подэлементу
            ObjectStack.pop();
            CurrentElement=(XMLObject) ObjectStack.lastElement();
        }
        Val="";    //обнуляем, что бы не оставалось ничего лишнего
    }
    
    /**
     * кишки элемента
     */
    public void characters(char[] ch, int start, int length){
        if (!((start+length)==ch.length)){//проверка - если значение элемента не влазит полностью в буфер, то запоминаем его начало.(8193)
            Val+=new String(ch, start, length);
/            if (!Par.equals("")){
                CurrentElement.Value=Val;
                type=2;
                CurrentElement=(XMLObject) ObjectStack.lastElement();
            }
            Par=Val="";
        } else {
            Val=new String(ch, start, length);
            if (!Val.trim().equals("")){
                CurrentElement.Value=Val;    
            }
        }
    }
    
    /**
     * док кончился
     */
    public void endDocument(){
//        System.out.println("всё! разобрали....");
    }

    public void ignorableWhitespace (char ch[], int start, int length) throws SAXException{
//     System.out.println("ignorableWhitespace");
    }

    public void processingInstruction (String target, String data) throws SAXException{
//     System.out.println("processingInstruction " + target + " " + data);
    }

    public void skippedEntity (String name)    throws SAXException{
//     System.out.println("skippedEntity " + name);
    }

    public void setDocumentLocator(Locator locator) {
//     System.out.println("  EVENT: setDocumentLocator");
    }
    
    public void startPrefixMapping (String prefix, String uri) throws SAXException{
//     System.out.println("startPrefixMapping "+ prefix + " = " + uri);
    }
    
    public void endPrefixMapping (String prefix) throws SAXException{
//     System.out.println("endPrefixMapping " + prefix);
    }


    ////////////////////////////////////////////////////////////////////
    // Implementation of org.xml.sax.ErrorHandler.
    ////////////////////////////////////////////////////////////////////

    public void warning (SAXParseException e) throws SAXException{
    System.out.println("  EVENT: warning " +
               e.getMessage() + ' ' +
               e.getSystemId() + ' ' +
               e.getLineNumber() + ' ' +
               e.getColumnNumber());
    }

    public void error (SAXParseException e)
    throws SAXException
    {
    System.out.println("  EVENT: error " +
               e.getMessage() + ' ' +
               e.getSystemId() + ' ' +
               e.getLineNumber() + ' ' +
               e.getColumnNumber());
    }

    public void fatalError (SAXParseException e)
    throws SAXException
    {
    System.out.println("  EVENT: fatal error " +
               e.getMessage() + ' ' +
               e.getSystemId() + ' ' +
               e.getLineNumber() + ' ' +
               e.getColumnNumber());
    }
}



PM MAIL   Вверх
LSD
Дата 22.8.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(clanda @  22.8.2008,  12:08 Найти цитируемый пост)
//проверка - если значение элемента не влазит полностью в буфер, то запоминаем его начало.(8193)

Нафига все это надо?

Не надо там ничего мудрить и проверять, просто добавить в конец строки и все. И лучше для конкатенации строк заранее создать StringBuffer, а потом его только очищать. И очищать его лучше в startElement().
Код

  private StringBuffer buffer = new StringBuffer();

  public void characters(char[] ch, int start, int length)
  {
    buffer.append(ch, start, length);
  }



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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