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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по JAXP 1.2, как заставить его работать 
V
    Опции темы
LSD
Дата 29.1.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(check @  29.1.2007,  15:30 Найти цитируемый пост)
Не один из этих классов компилятор не находит.

Не может этого быть, все эти классы есть в JDK 1.5 (они даже есть в JDK 1.4).

Transforming XML Data with XSLT


--------------------
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   Вверх
check
Дата 29.1.2007, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(check @  29.1.2007,  16:41 Найти цитируемый пост)
Вот этот момент мне непонятен.   Как осуществить эту запись в файл? 

Это кажется понял.



[
PM MAIL   Вверх
check
Дата 30.1.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Решил все-таки делать через SAX.

Вот класс, который выводит названия всех тегов и заключенные в них текстовые значения
Код

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

public class  Transform extends HandlerBase {

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

  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 {
     System.out.println("element start " + el_name);
   
    if (attr != null) {
          for (int i=0; i < attr.getLength(); i++) 
                    System.out.println(attr.getName(i) + " = " + attr.getValue(i));
    } 

   //массив в который помещаются значения узлов
   String[] dataFromXML = {num, fam, im, ot, document, docSeria, docNum, datavd};

   FWriter fr = new FWriter(dataFromXML);
   fr.save();
}

 public void characters(char buf [], int offset, int len) throws SAXException {
       if (len > 0) {
            String content = new String(buf, offset, len);
            System.out.println("characters  " + content);
       }
}

}

Строковые поля объявленные в начале - это значения нескольких тегов которые, предположим , меня интересуют(на самом деле их конечно больше).


Далее я должен эти поля поместить в массив,  а массив передать в конструктор класса,   пишущего в файл.  Это конечно приблизительная схема,  имя txt-файла будет определятся именем XML-я.
Код

 //массив в который помещаются значения узлов
   String[] dataFromXML = {num, fam, im, ot, document, docSeria, docNum, datavd, inn};

   FWriter fr = new FWriter(dataFromXML);
   fr.save();

class FWriter {

    File txt;
    String[] values;
   
    FWriter(String[] values) {

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

    public void save() {
        try
        {
            PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(txt)));
            for (int i=0;  i < values.length;  i++) {
                  out.print(values[i] + ", ");   
            }
            out.close();
        }
        catch(IOException ex) {};
    }
}


Вопрос в том как организовать в методе characters() присвоение текстовых значений тегов соответсвующим переменным. 
То есть если тег называется <ИНН>, берем его значение и помещаем в inn, и так далее.
PM MAIL   Вверх
batigoal
Дата 30.1.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



check, сделай через HashMap. Ключом будет "inn", значением - соответственно, его значение.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
check
Дата 30.1.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

 public void characters(char buf [], int offset, int len) throws SAXException {
     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;
    }
//массив в который помещаются значения узлов
   String[] dataFromXML = {num, inn,kpp,org};

   FWriter fr = new FWriter(dataFromXML);
   fr.save();
 }

Вроде бы  они и извлекаются, но в файл пишутся переводы строки через запятую.
Цитата(batigoal @  30.1.2007,  14:43 Найти цитируемый пост)
check, сделай через HashMap. Ключом будет "inn", значением - соответственно, его значение. 
Я пока через массив делаю, но это надо  ещё посмотреть по структуре, может лучше и так.

PM MAIL   Вверх
check
Дата 30.1.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(check @  30.1.2007,  15:01 Найти цитируемый пост)
в файл пишутся переводы строки через запятую
Причина в том, что метод haracters()
вызывается для каждого тега и соответственно файл каждый раз перезаписывается тем что есть в массиве на данный момент.
При последнем вызове, поскольку тег не подходит ни под одно из условий, массив пустой.

Это сообщение отредактировал(а) check - 30.1.2007, 16:06
PM MAIL   Вверх
LSD
Дата 30.1.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Сделай запись в файл в обработчике endDocument (), и перейди на DocumentHandler.


--------------------
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   Вверх
check
Дата 30.1.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(check @  30.1.2007,  16:05 Найти цитируемый пост)
При последнем вызове, поскольку тег не подходит ни под одно из условий, массив пустой.
Это конечно ерунда,  если переменная получила значение она должна сохранить его до конца.

Я вспомнил про метод endDocument().  Запись в файл я поместил туда, тобы она происходила  один раз при достижении конца документа.
Код

 public void endDocument() throws SAXException  {
     System.out.println(inn + "\n"); //пусто
     String[] dataFromXML = {num, inn,kpp,org};
     FWriter fr = new FWriter(dataFromXML);
     fr.save();
 }   


Но переменные которым в методе characters() присвоены значения: 
Код

public void characters(char buf [], int offset, int len) throws SAXException {
     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;
    }
//массив в который помещаются значения узлов
   String[] dataFromXML = {num, inn,kpp,org};

   FWriter fr = new FWriter(dataFromXML);
   fr.save();
 }

в endDocument() пусты.  Соответственно  массив тоже пуст,  а в файл пишутся квадраты через запятую  smile 

Провёл такой эксперимент.  При объявлении присвоил переменным начальные значения
Код

    String num= "1";  
    String  fam= "1";
    String im= "1";
    String ot= "1";
    String document= "1";
    String docSeria= "1";
    String docNum= "1";
    String datavd= "1";
    String inn= "1";
    String kpp= "1";
    String org= "1";
Переменные не затронутые в методе characters() в endDocument() имеют значение "1",  остальные - пусто.
При этом если их вывести в самом методе  characters(), они имеют нормальные значения взятые из xml-я.

Добавлено @ 17:45 
Цитата(LSD @  30.1.2007,  17:37 Найти цитируемый пост)
Сделай запись в файл в обработчике endDocument (), и перейди на DocumentHandler. 

Первое уже сделал.  Что такое DocumentHandler?

Это сообщение отредактировал(а) check - 30.1.2007, 20:24
PM MAIL   Вверх
LSD
Дата 30.1.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Вместо:
Код
public class Transform extends HandlerBase

используй:
Код
public class  Transform implements DocumentHandler


По поводу первой проблемы, посмотри под отладчиком метод characters() вообще вызывается.


--------------------
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   Вверх
check
Дата 30.1.2007, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пришлось сделать так
Код

public class  Transform extends HandlerBase implements DocumentHandler

В интерфейсе DocumentHandler нет метода parse().
Но ничего не изменилось.
characters() вызывается
Код

 public void characters(char buf [], int offset, int len) throws SAXException {
       String content = null;
       if (len > 0) {
            content = new String(buf, offset, len);
            System.out.println("characters  " + content);
       }
    if (element.equals("НомерВпачке")) {
           num =  content;
          System.out.println(num + "\n");
     }
     else if (element.equals("ИНН")) {
           inn = content;
           System.out.println(inn + "\n");
    }
     else if (element.equals("КПП")) {
           kpp = content;
           System.out.println(kpp + "\n");
    }
     else if (element.equals("НаименованиеОрганизации")) {
           org = content;
           System.out.println(org + "\n");
    }  

}
выводит то что нужно.
PM MAIL   Вверх
check
Дата 31.1.2007, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как сделать чтобы в файл добавлялись строки не пеезаписывая файл?
(да, плоховато я ещё знаю Java=))

Это нужно в любом случае, но я ещё чувствую,  что это  ключ к решению проблемы.
Похоже на то, что метод characters() вызывается в любом случае более одного раза для каждого тега и при последнем вызове
считывает то ли null, то ли перевод строки. 

Это сообщение отредактировал(а) check - 31.1.2007, 10:35
PM MAIL   Вверх
check
Дата 31.1.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нашел
Код

FileWriter(txt, true)



Цитата(check @  31.1.2007,  10:34 Найти цитируемый пост)
Похоже на то, что метод characters() вызывается в любом случае более одного раза для каждого тега и при последнем вызове
считывает то ли null, то ли перевод строки. 

Так и есть. Вот что пишется для в файл из такого тега: <СистемныйНомерМассиваПоручений>060-009-2006-00005</СистемныйНомерМассиваПоручений> 

Тег встречается в документе два раза

Код

060-009-2006-00005, 
     , 
     , 060-009-2006-00015, 
     , 
     , 

То есть получается - текст, потом два перевода строки.
PM MAIL   Вверх
check
Дата 31.1.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(batigoal @  30.1.2007,  14:43 Найти цитируемый пост)
check, сделай через HashMap. Ключом будет "inn", значением - соответственно, его значение


Последовал совету - создал типизированный HashMap
Код

HashMap<String, String>


Код теперь выглядит гораздо приятнее, хотя переводы строки в файл по-прежнему пишутся.

Вопрос решён, большое спасибо!

Это сообщение отредактировал(а) check - 31.1.2007, 23:22
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.0955 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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