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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Результаты парсинга XML, выводится, много, мусора 
V
    Опции темы
check
Дата 31.1.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Программа должна считывать из XML значения определённых тегов и записывать их в файл как поля,
разделённые запятыми. 

Код

import org.xml.sax.*;
import javax.xml.parsers.*;
import javax.xml.parsers.SAXParser;
import java.io.*;
import java.util.*;


public class  Transform extends HandlerBase implements DocumentHandler {

//текстовые данные заключенные в соответствующие теги
 String num, fam, im, ot, document, docSeria, docNum, datavd, inn, kpp, org;  
//текущий тег
 String element;

  public static void main(String fname[]) {
  
        SAXParserFactory saxFactory = SAXParserFactory.newInstance();
        saxFactory.setValidating(false);
   
        try {
             SAXParser saxParser = saxFactory.newSAXParser();
             saxParser.parse(new File(fname[0]),  new Transform());
         }
        catch(SAXParseException ex) { System.out.println("ParseError:" + ex.getMessage()); }
        catch(SAXException ex) { ex.printStackTrace(); } 
        catch(ParserConfigurationException ex) { ex.printStackTrace(); }
        catch(IOException ex) { ex.printStackTrace(); }
   }

  public void setDocumentLocator(Locator fname) {
        System.out.println("start  " + fname.getSystemId());
  }

 public void startDocument() throws SAXException {
    
 }

 public void startElement(String el_name, AttributeList attr) throws SAXException {
 }

 public void characters(char buf [], int offset, int len) throws SAXException {

     Saver saver = new Saver();
     String content = null;
     if (len > 0) {
           content = new String(buf, offset, len);
          
     }
     if (element.equals("НомервПачке")) {
           num =  content;
     }
     else if (element.equals("ИНН")) {
           inn = content;
     }
     else if (element.equals("КПП")) {
           kpp = content;
     }
     else if (element.equals("НаименованиеОрганизации")) {
           org = content;
     }  
     saver.write(num, inn, kpp, org);
}

 public void endDocument() throws SAXException  {

 }   

}

class Saver {

   public String num;
   public String inn;
   public String kpp;
   public String org; 

   public void write(String num, String inn, String kpp, String org) {

         this.num = num;
         this.inn = inn;
         this.kpp = kpp;
         this.org = org;  
         
         HashMap<String, String> dataFromXML = new HashMap();
         dataFromXML.put("num", num);
         dataFromXML.put("inn", inn);
         dataFromXML.put("kpp", kpp);
         dataFromXML.put("org", org);
         FWriter fr = new FWriter(dataFromXML);
         fr.save();
          
   }
}

class FWriter {

    File txt;
    HashMap<String, String> values;
  
    FWriter(HashMap<String, String> values) {

         txt = new File("data.txt");
         this.values =  values;
     
    }

    public void save() {
        try
        {
            PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(txt, true)));    
            String Num = values.get("num");   
            String Inn = values.get("inn");   
            String Kpp = values.get("kpp");    
            String Org = values.get("org"); 
        //условия в if это мои наивные попытки очистить вывод от лишних символов     
            if (Num != null &&  !"null".equals(Num) && Num != "\n" && !"\n".equals(Num) && Num != "" && !"".equals(Num))                                                                                                                                                                       
                   out.print(values.get("num") + ",");
            if (Inn != null && "null".equals(Inn) && Inn != "\n" && !"\n".equals(Inn) && Inn != "" && !"".equals(Inn))
                   out.print(values.get("inn") + ",");
            if (Kpp != null && "null".equals(Kpp) && Kpp != "\n" && !"\n".equals(Kpp) && Kpp != "" && !"".equals(Kpp))
                   out.print(values.get("kpp") + ",");
            if (Org != null && "null".equals(Org) && Org != "\n" && !"\n".equals(Org) && Org != "" && !"".equals(Org))
                   out.print(values.get("org") + ","); 

            out.close();
        }
        catch(IOException ex) {};
    }
}



Считывать то она считывает, а вот записывает не совсем так как хочется. В файл кроме нужных текстовых значений записываются null и переводы строки.
Откуда взялись null в принципе понятно.
Метод characters()
Код

 public void characters(char buf [], int offset, int len) throws SAXException {

     Saver saver = new Saver();
     String content = null;
     if (len > 0) {
           content = new String(buf, offset, len);
          
     }
     if (element.equals("НомервПачке")) {
           num =  content;
     }
     else if (element.equals("ИНН")) {
           inn = content;
     }
     else if (element.equals("КПП")) {
           kpp = content;
     }
     else if (element.equals("НаименованиеОрганизации")) {
           org = content;
     }  
     saver.write(num, inn, kpp, org);
}

вызывается для каждого тега и если он не соответствует условию element.equals("имя_тега"), то saver.write(num, inn, kpp, org) вызывается с аргументами равными null.
    
От null в файле можно избавиться как-то так
Код

   public void write(String num, String inn, String kpp, String org) {

         this.num = num;
         this.inn = inn;
         this.kpp = kpp;
         this.org = org;  
         if(num == null) num = "";
         if(inn == null) inn = "";
         if(kpp == null) kpp = "";
         if(org == null) org = "";
         HashMap<String, String> dataFromXML = new HashMap();
         dataFromXML.put("num", num);
         dataFromXML.put("inn", inn);
         dataFromXML.put("kpp", kpp);
         dataFromXML.put("org", org);
         FWriter fr = new FWriter(dataFromXML);
         fr.save();
   }

Допустим избежать записи в файл пустых строк через запятую в случаях когда num = "" и т.д. тоже можно. Но как выловить переводы строки я что-то пока не смог придумать.
PM MAIL   Вверх
Hidrag
Дата 31.1.2007, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



проверяй длину строки перед записью, если она 0 значит пустышка и ее записывать не нужно, а также ко всем стрингам что нужно записать перед записью используй метод trim это удалит весь мусор вначале и конце строки, в том числе и переводы строк.

Это сообщение отредактировал(а) Hidrag - 31.1.2007, 22:41


--------------------
user posted image
PM WWW ICQ   Вверх
check
Дата 31.1.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как я мог забыть про trim!!!??? 
+1 однозначно, как сказал бы один известный артист и политик! 
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.0426 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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