Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Помогите!!!Срочно! Реализация java+xml+PostgreSQL
Список форумов
 ->  Работа с базами данных


На страницу Пред.  1, 2 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Annett : 18
Новичок
Откуда: Donetsk,Ukraine

СообщениеДек 23, 2011 23:46 
Ответить с цитатой
Daigotsu,
спасибо большое за подсказку о вызове ХП.

Проблема в следущем.
Код записи таблицы в файл в мой процедуре такой:
Код:
copy (select table_to_xml('a', true, true, '')) to
'D:\\TestTask\\PersonsForm\\use.xml';

Но xml-файл получается такой:
<a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n\n <code_user>2</code_user>\n <first_name>Houston</first_name>\n <name>Whitney</name>\n <last_name>Father</last_name>\n <name_for_print xsi:nil="true"/>\n <phone_num xsi:nil="true"/>\n <code_phone xsi:nil="true"/>\n <addition_code xsi:nil="true"/>\n</a>\n\n
Во-первых все на одной строчке. Еще пока незнаю, насколько это критично, но все же как сделать нормальный формат?
Во-вторых, ни браузер, ни ява его не открывают из-за символов \n\n в двух местах в файле.
Если их убрать вручную, то ява не ругается, что не может открыть файл (разбор пока не далала, поэтому незнаю, как это отразится на нем), а браузер выводит:
2\n Houston\n Whitney\n Father\n \n \n \n \n
Пробовала ставить
DELIMITER "\n" , но при компиляции процедуры выпадает ошибка:
ERROR: syntax error at or near ""\n""
LINE 40: DELIMITER "\n"
^
Что делать? Как это решить?
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Annett : 18
Новичок
Откуда: Donetsk,Ukraine

СообщениеДек 24, 2011 2:47 
Ответить с цитатой
Хотела пойти на крайние меры, удалять эти символы в java.
Код:
 BufferedReader in;
         try {
           in = new BufferedReader(new InputStreamReader(new FileInputStream("use.xml")));
            String s = in.readLine();
            System.out.println(s);
            s = s.replaceAll("\n", "");
            System.out.println(s);
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("use.xml",true)));
            out.write(s);
            out.close();
            System.out.println(s);
        } catch (IOException e) {
        }

Но это не работает. :(
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Annett : 18
Новичок
Откуда: Donetsk,Ukraine

СообщениеДек 28, 2011 8:46 
Ответить с цитатой
Подскажите, как сделать разбор xml документа? У меня не работает ни один пример из инета.
Если делаю так:
Код:
public static void readXMLUsers(Document xmlDoc)  {

    try {
    Element rootel=xmlDoc.getRootElement();
    //вывод имени корневого элемента
    System.out.println(rootel.getName());
    //список имен дочерних элементов
    System.out.println("Список имен дочерних элементов:");
    List nlist=xmlDoc.getRootElement().getContent();
    Iterator iterator=nlist.iterator();

    while (iterator.hasNext()){
      Element nextel=(Element) iterator.next();
      String id=nextel.getChildText("code_user");
      String first_name=nextel.getChildText("first_name");
      String name=nextel.getChildText("name");
      String last_name=nextel.getChildText("last_name");
      System.out.println(id+" "+first_name+" "+name+" "+last_name);

    }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}


то у меня выводится вместо нормального разбора документа следующее:
a
Список имен дочерних элементов:
null null null null
null null null null
null null null null
null null null null

Если сделать так:
Код:
public static void readXMLUsers(Document xmlDoc)  {

    try {
    Element rootel=xmlDoc.getRootElement();
    //вывод имени корневого элемента
    System.out.println(rootel.getName());
    //список имен дочерних элементов
    System.out.println("Список имен дочерних элементов:");
    List nlist=xmlDoc.getRootElement().getContent();
    Iterator iterator=nlist.iterator();
    while (iterator.hasNext()){
      //Element nextel=(Element) iterator.next();
      String id=rootel.getChildText("code_user");
      String first_name=rootel.getChildText("first_name");
      String name=rootel.getChildText("name");
      String last_name=rootel.getChildText("last_name");
      System.out.println(id+" "+first_name+" "+name+" "+last_name);

    }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}


то разбор документа бесконечен и на выходе получаю:
a
Список имен дочерних элементов:
1 aaa bbb ccc
1 aaa bbb ccc
1 aaa bbb ccc
1 aaa bbb ccc
и так далее.
Если сделаю без цикла, то получаю правильно:
Код:
public static void readXMLUsers(Document xmlDoc)  {

    try {
    Element rootel=xmlDoc.getRootElement();
    //вывод имени корневого элемента
    System.out.println(rootel.getName());
    //список имен дочерних элементов
    System.out.println("Список имен дочерних элементов:");
    List nlist=xmlDoc.getRootElement().getContent();
    Iterator iterator=nlist.iterator();
   // Iterator iterator=/*(Iterator)*/ nlist.iterator();

   // while (iterator.hasNext()){
      //Element nextel=(Element) iterator.next();
      String id=rootel.getChildText("code_user");
      String first_name=rootel.getChildText("first_name");
      String name=rootel.getChildText("name");
      String last_name=rootel.getChildText("last_name");
      System.out.println(id+" "+first_name+" "+name+" "+last_name);

   // }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

На выходе:
a
Список имен дочерних элементов:
1 aaa bbb ccc
Документ сейчас такой:
Код:
<?xml version="1.0" encoding="UTF-8"?>
<a>
<code_user>1</code_user>
<first_name>aaa</first_name>
<name>bbb</name>
<last_name>ccc</last_name>
</a>


Но документ будет содержать несколько пользователей. Т.е. мне нужна обработка всего файла. Как сделать?
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Daigotsu : 170
Новичок

СообщениеДек 29, 2011 2:01 
Ответить с цитатой
парсеры xml не сложно сделать. есть несколько основных видов. SAX, StAX, DOM. в зависимости от нужд выбираются. писать сюда как и что делается - смысла нет, давайте вам дам точно рабочие примеры: http://www.epam.by/doc/book_epam_by/Part_2_Chapter_16.pdf
если надо свои реализации могу показать,
К началу Посмотреть профиль Отправить личное сообщение
Annett : 18
Новичок
Откуда: Donetsk,Ukraine

СообщениеФев 07, 2012 22:05 
Ответить с цитатой
Всем участвующим огромное спасибо. Задание выполнила.
Напишу как реализовала на случай, если кому-то понадобится.
Как уже писала подключение сделала следующим образом:
Код:
public static boolean ConnToDataBase() {
//Подключение к базе данных

  try {
//подключение драйвера базы данных
Class.forName("org.postgresql.Driver");
//Драйвер подключен
   try{ //Пытаемся соединиться с БД
      my_base=DriverManager.getConnection("jdbc:postgresql://localhost:5432/test_task?user=postgres&password=masterkey");

     if (my_base!=null){
    //С базой соединились
    System.out.println("Соединение с базой прошло успешно");
     }
      return true;
  }
  catch(SQLException ex){
      //обработка исключения
      System.out.println("SQLException:"  + ex.getMessage());
      System.out.println("SQLState  : " + ex.getSQLState());
      System.out.println("ErrorCode : " + ex.getErrorCode());
      JOptionPane.showMessageDialog( null,"Ошибка при подключени к базе данных!",
             "Ошибка!",JOptionPane.ERROR_MESSAGE);
      return false;
  }
  }
  catch(java.lang.ClassNotFoundException e){
      JOptionPane.showMessageDialog( null,"Ошибка при подключени драйвера!",
             "Ошибка!",JOptionPane.ERROR_MESSAGE);
      return false;
  }

   }


Метод для создание XML-документа реализовала так:

Код:
 public static Document SearchUser(String p_name_for_print,String p_phone_num)
    //метод для создания файла для ХП viewer
    {
        Element aElement=new Element("a");
        Document XMLDocument=new Document(aElement);
        Element row=new Element("row");
        aElement.addContent(row);
        Element searchus=new Element("name_for_print");
        searchus.addContent(p_name_for_print);
        row.addContent(searchus);
        row.addContent(new Element("phone_num").addContent(p_phone_num));

   return XMLDocument;
    }


Этот документ служит в качестве параметра хранимой процедуры в БД. ХП возвращает также XML-документ, в java-программе происходит его разбор. Метод разбора документа реализован так:

Код:
public static List<UserClass> readXMLUsers(Document xmlDoc)  {
    //Разбор документа с пользователями
    try {
         PersonFormUI.UserList.clear();
    } catch (NullPointerException e) {
    }

            List<UserClass> Us=new ArrayList<UserClass>();
       Element rootel=xmlDoc.getRootElement();
            List nlist=rootel.getChildren("row");
            for (int k=0;k<nlist.size();k++){
                Element node=(Element)nlist.get(k);
                String id=node.getChildText("code_user");
                if ("-1".equals(id)){
                    Us=null;
                    break;
                }
                else{
try{     
               Us.add(new UserClass());
                Us.get(k).setCodeUser(id);
               String first_name=node.getChildText("first_name");
               Us.get(k).setFirstName(first_name);               
               String name=node.getChildText("name");
               Us.get(k).setName(name);
               String last_name=node.getChildText("last_name");
               Us.get(k).setLastName(last_name);
              }
              catch (NoSuchElementException e){
                  System.out.println("Error:"+e);
              }
              } 
           
            }

    return Us;
}



Вызов ХП реализован так:
Код:
public static void Search(String p_name_for_print,String p_phone_num){
//Поиск пользователей по ФИО/телефон
Document workDok = XMLClass.SearchUser(p_name_for_print, p_phone_num);
//               вызов ХП viewer(xml)
String SDoc = null;
XMLOutputter outputter = new XMLOutputter();
SDoc=outputter.outputString(workDok);
String SQL="{?=call viewer(?)}";
            try {
                CallableStatement cs=my_base.prepareCall(SQL);
               cs.setString(1,SDoc);
                cs.registerOutParameter(2,java.sql.Types.VARCHAR);
                cs.execute();
               System.out.println("Получилось вызвать ХП viewer!");
                SDoc=cs.getString(2);
            } catch (SQLException ex) {
                System.out.println("Невозможно вызвать ХП viewer!");
                System.out.println("Error: "+ex.getMessage());
                System.out.println("Error: "+ex.getSQLState());
                System.out.println("Error: "+ex.getErrorCode());
            }
try {
SAXBuilder parser = new SAXBuilder();
workDok  = parser.build(new StringReader(SDoc));
} catch (JDOMException ex) {
System.out.println("Error: "+ex.getMessage());
} catch (IOException ex) {
System.out.println("Error: "+ex.getMessage());
     }
UserList=XMLClass.readXMLUsers(workDok);           
if (UserList!=null){
    //Заносим телефоны пользователей в UserList.UserPhone
toUserClass();
}
else {
  System.out.println("UserList=null "); 
}
}


Метаданные:

Код:
public class UserClass {
    private String code_user;
    private String first_name;
    private String name;
    private  String last_name;
    public   List<PhoneClass> UserPhone;
}

public class PhoneClass {
    private String phone_num;
    private String code_phone;
}


Хранимая процедура , на примере которой выше описан java код сделана так:
Код:
-- Function: viewer(text)

CREATE OR REPLACE FUNCTION viewer(text)
  RETURNS text AS
$BODY$
DECLARE
  u xml;
  str varchar(65);
  c integer;
BEGIN
SET xmloption TO Document ;
u=XMLPARSE (DOCUMENT $1);
DELETE from a;
str:=trim((xpath('//name_for_print/text()',u))[1]::text);
IF (str<>'') then
--Поиск по ФИО
str:='%'||str||'%';

INSERT INTO "a"
(code_user, first_name , name , last_name )
(select us.code_user , us.first_name , us.name , us.last_name
from users us
where lower(trim(us.first_name)||' '||trim(us.name)||' '||trim (us.last_name)) like lower(str)
order by us.code_user);

ELSE
str:=trim((xpath('//phone_num/text()',u))[1]::text);
IF (str<>'') THEN
--Поиск по тел
str:='%'||replace(str,' ','')||'%';

INSERT INTO "a"
(code_user, first_name , name , last_name)
(select distinct us.code_user , us.first_name , us.name , us.last_name
from users us,phone_numbers pn
where pn.user_insert=us.code_user
and pn.phone_num like str
order by us.code_user);

ELSE
str:=trim((xpath('//code_user/text()',u))[1]::text);
IF (str<>'') THEN
--Вывод телефонов

INSERT INTO "a"
(phone_num,code_phone)
(select phone_num,code_phone
from phone_numbers pn
where pn.user_insert=CAST(str as integer)
order by pn.code_phone);

ELSE
INSERT INTO "a"
(code_user, first_name , name , last_name)
(select us.code_user , us.first_name , us.name , us.last_name
from users us
order by us.code_user);
END IF;
END IF;
END IF;
u:=table_to_xml('a', true, false, '');
u:=xmlserialize(document u as text);
return u;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION viewer(text)
  OWNER TO postgres;
 


Метаданные БД:
Код:
CREATE TABLE users
(
  code_user integer NOT NULL,
  first_name character varying(25) NOT NULL,
  name character varying(15) NOT NULL,
  last_name character varying(25) NOT NULL,
  description character varying(255),
  date_insert timestamp without time zone DEFAULT now(),
  name_for_print character varying(65),
  CONSTRAINT users_pkey PRIMARY KEY (code_user )
)
CREATE TABLE phone_numbers
(
  code_phone integer NOT NULL,
  phone_num character varying(12) NOT NULL,
  user_insert integer,
  date_insert timestamp without time zone DEFAULT now(),
  CONSTRAINT phone_numbers_pkey PRIMARY KEY (code_phone ),
  CONSTRAINT phone_numbers_user_insert_fkey FOREIGN KEY (user_insert)
      REFERENCES users (code_user) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
)
CREATE TABLE a
(
  code_user character varying(10),
  first_name character varying(25),
  name character varying(15),
  last_name character varying(25),
  name_for_print character varying(65),
  phone_num character varying(12),
  code_phone character varying(10)
)


А - используется как временная таблица для хранимых процедур.

Обращаю внимание, что ХП принимает не XML параметр, а текст, кот. преобразуется и обрабатывается в XML и возвращает ХП тоже не XML, а текст. Тоже происходит в java-коде, документ сначала преобразуется в строку, потом вызывается ХП, потом возвращается результат выполнения ХП как строка, потом эта строка преобразуется в документ, и в конечном счете делается разбор этого документа.

Вот, наверное, и все. Прошу не судить строго, это моя первая более или менее серьезная программа на java, но если есть вопросы или замечания, то пишите.
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
 
Начать новую тему  Ответить на тему
Страница 2 из 2
На страницу Пред.  1, 2
Список форумов
 -> Работа с базами данных


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru