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


Автор: check 31.1.2007, 22:25
Программа должна считывать из 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 = "" и т.д. тоже можно. Но как выловить переводы строки я что-то пока не смог придумать.

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

Автор: check 31.1.2007, 23:09
Как я мог забыть про trim!!!??? 
+1 однозначно, как сказал бы один известный артист и политик! 

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