|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
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"
^
Что делать? Как это решить? |
|
|
|
 |
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) {
}
|
Но это не работает. :( |
|
|
|
 |
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> |
Но документ будет содержать несколько пользователей. Т.е. мне нужна обработка всего файла. Как сделать? |
|
|
|
 |
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, но если есть вопросы или замечания, то пишите. |
|
|
|
 |
|
|
Страница 2 из 2 На страницу Пред. 1, 2 |
Список форумов
-> Работа с базами данных |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|