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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как извлечь xml-данные? jsp+servlets+xpath+jdbc 
:(
    Опции темы
azalia
Дата 20.5.2015, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mbasil @  20.5.2015,  22:35 Найти цитируемый пост)
1. Извлечь "сырой" XML можно посредством запроса с помощью JDBC. В Java встроены XML анализаторы DOM,SAX,STAX,JAXB, ................


ну вот, а я надеялась что с ними не придется мучится, неужели без них никак?
думала, что мне придется только запросить из базы нужные данные с использованием xpath и  вывести полученные данные на печать, разве sqlxml не компенсирует все эти затраты на парсинг? зачем его тогда создали...

Цитата(mbasil @  20.5.2015,  22:35 Найти цитируемый пост)

2.Для проверки кириллицы, чтобы сильно не ломать голову, скачайте и инсталлируйте NetBeans. ......... 


хорошо попробую так, если места хватит на виртуальной машине...

Это сообщение отредактировал(а) azalia - 20.5.2015, 22:55
PM   Вверх
mbasil
Дата 21.5.2015, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 13



Я не слишком хорошо знаю MSSQL, так что возможно имеются средства базы, позволяющие запрос по xpath.
PM MAIL   Вверх
azalia
Дата 21.5.2015, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А эта ошибка о чем говорит? Не определен такой объект?

Код

Tool Finished with exit code 1
Error in line Number:55: error: cannot find symbol
    Document document = (Document) domSource.getNode();
    ^
  symbol:   class Document
  location: class BooksJsp
Error in line Number:55: error: cannot find symbol
    Document document = (Document) domSource.getNode();
                         ^
  symbol:   class Document
  location: class BooksJsp
2 errors

PM   Вверх
LSD
Дата 21.5.2015, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(azalia @  21.5.2015,  11:08 Найти цитируемый пост)
А эта ошибка о чем говорит? Не определен такой объект?

Не импортирован. Нормальная IDE сразу покажет такую ошибку и предложит пути решения.


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


Шустрый
*


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

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



Установила NetBeans 8 + Tomcat 8

Проект не выполняется, пишет ошибку:

Код


Не удалось запустить Tomcat.
C:\NetBeansProject\testApp\nbproject\build-impl.xml:1045: Ошибка при развертывании: Не удалось запустить Tomcat.
Для получения подробных сведений см. протокол сервера.


Как с этим бороться?
PM   Вверх
mbasil
Дата 21.5.2015, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 13



1. Проверьте переменную окружающей среды CATALINA_HOME, на какой из серверов она указывает (запускаться должен только один) . Переменную TOMCAT_HOME лучше не использовать, так как она работает только в Windows.

2 Обязательно должна быть установлена переменная JAVA_HOME. Если вы используете версию 8, то и JAVA_HOME должна указывать на JDK версии 8. При использовании Tomcat не устанавливайте JDK в директорию с пробелом, типа "Program Files"

3. В файле CATALINA_HOME/conf/server.xml должен использоваться порт, который свободен. По умолчанию он хочет 8080.

    <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true"/>

Проверьте - не занят ли порт или просто замените. Я обычно использую номер 8089

4. Для запуска сервера через его административную утилиту manager, NetBeans'у нужен администратор. В файле

CATALINA_HOME/conf/tomcatusers должна быть запись, похожая на:

<tomcat-users>
   <user name="admin" password="password" roles=" manager,script-manager" />
...
</tomcat-users>

5. При работе через NetBeans не запускайте сервер вручную, а перейдите на закладку Services, разверните узел Servers, найдите пиктограмму кота и щелкнув по ней правой кнопкой мыши выберите Start. Проверьте предварительно, чтобы Tomcat не был ранее стартован другими средствами. Там же можно в диалоговом окошке настроить свойства сервера. Посмотрите, какой там номер порта и при необходимости измените. 
Останавливайте тоже оттуда. 


Это сообщение отредактировал(а) mbasil - 21.5.2015, 20:45
PM MAIL   Вверх
azalia
Дата 22.5.2015, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не получилось у меня подружиться с NetBeans. Все снесла, включая Tomcat 8.
Установила Eclipse и Tomcat 7.
Заработало...
Хотя тоже пришлось помучиться.
PM   Вверх
azalia
Дата 22.5.2015, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не знаю, может я не совсем корректно задам вопрос, но мне не понятен один момент.
Почему при SAХ-парсинге в одном из примеров в параметре QNAME указывается не префикс, а имя тега? логичнее было бы там указывать префикс? 


Код

myHandler.startDocument();
myHandler.startElement(null, "contact", "contact", null);
....
myHandler.endDocument();


Это сообщение отредактировал(а) azalia - 22.5.2015, 13:45
PM   Вверх
mbasil
Дата 22.5.2015, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 13



Почему это логичнее? Элемент может быть любым из пространства имен, а префикс ведь придуман для создания уникального пространства имен, объединяющего набор элементов. 
То есть QNAME это квалифицированное имя элемента, как один префикс может сказать - какой из них?
Не забывайте тот факт, что мы имеем дело с методом обратного вызова (callback method)

Это сообщение отредактировал(а) mbasil - 22.5.2015, 14:47
PM MAIL   Вверх
azalia
Дата 22.5.2015, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mbasil @  22.5.2015,  14:29 Найти цитируемый пост)
Элемент может быть любым из пространства имен, а префикс ведь придуман для создания уникального пространства имен, объединяющего набор элементов. 
То есть QNAME это квалифицированное имя элемента, как один префикс может сказать - какой из них?


Я понимаю что префикс нужен для уникальности...
Значит, если бы у тега был префикс, то было бы тогда так?

 
myHandler.startElement(null, "contact", "с:contact", null);

При этом еще тогда первый null (namespaceURI) должен быть заполнен, типа:

http://adcd.com/abcd

и это будет соответствовать XML:

<с:contact xmlns:с="http://adcd.com/abcd">
  <c:name>Вася</c:name>
  <c:phone>12345</c:phone>
</c:contact>

Это сообщение отредактировал(а) azalia - 22.5.2015, 15:13
PM   Вверх
mbasil
Дата 22.5.2015, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 13



Префикс для Target Namespace можно опускать, поэтому то здесь Local Namt и Qualified Name совпадают, но если вы посмотрите документацию, то увидите, что в определенных ситуациях может быть опущено одно, или другое имя. 

Это сообщение отредактировал(а) mbasil - 22.5.2015, 18:57
PM MAIL   Вверх
azalia
Дата 22.5.2015, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо за подсказку, похоже это надо просто потренироваться... у меня уже назрел другой вопрос smile

А как в сервлет вывести содержимое объекта типа xml на экран?

Каждый раз когда я пытаюсь обратиться .getString(), выдаются ошибки:
 
"Выполняется доступ к данным. Данные недоступны для этого столбца или параметра."

или

"Не удается считать данные из этого экземпляра, данные уже считаны"

Код

SQLXML xmlSource = rs.getSQLXML("Name");
SAXSource sxSource =  xmlSource.getSource(SAXSource.class);
XMLReader xmlReader = sxSource.getXMLReader();
xmlReader.setContentHandler(myHandler);
xmlReader.parse(sxSource.getInputSource());


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

Если я буду делать все без всяких парсеров и просто обращаться к результирующему набору sql, то данные в браузер через .getString() выводятся, т.е. автоматически извлекаются из столбца типа xml в виде обычных строк текста (причем если смотреть получаемый код html, то там остается некоторая информация о тегах) и все.... это ведь нельзя назвать xml-данными?

Это сообщение отредактировал(а) azalia - 22.5.2015, 20:42
PM   Вверх
mbasil
Дата 23.5.2015, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 13



Все просто. Вы в своем обработчике, реализующем ContentHandler должны в методах startElement(), endElement() и characters() ПРИНЯТЬ данные, которые Вам засылает анализатор, я уже напоминал, что это callback методы. Кстати SAX подходит для обработки очень больших документов, структура которых полностью стабильна, так как надо много писать текста. Для небольших по размеру и относительно стабильных по структуре источников я предпочитаю JAXB, который был разработан для веб-сервисов и артефакты Java просто генерирует. В этом случае сложность не в написании програмы (как в SAX), а в том, чтобы разобраться с процессом генерирования и в сгенерированных классах.
PM MAIL   Вверх
azalia
Дата 23.5.2015, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А для меня как-то пока сложно smile

Код

public doGet{
// получаем параметры
String par = request.getParameter("parameter");

//вызываем нужный метод для его обработки, смотря что хотим делать с данными
transXML(par)

//чтобы отразить результат в браузере
PrintWriter out = response.getWriter();
out.println(..результат..+ res.getString())

}

public void transXML() {
// подключаемся к БД
// передаем параметр на обработку (пока не знаю как), получаем какой-то результат из БД
// обрабатываем результат, парсим
// записываем результат в какую-нибудь переменную res
// здесь же можем вывести результат через System.out.println, но он не отразится в браузере
// если пишем out.println, то не определена out, даже если ее определим, то потом ругается что нету response
}


Так наверно будет не совсем правильно, да?
Если реализовывать методы через обычные java-классы (в зависимости от целей обработки для каждого метода пусть будет отдельный java-класс), то снова вопрос как передать результат обработки в сервлет?
Или на каждую кнопку вызова (на клиенте) делать отдельный сервелет с отдельной функциональностью?
Под кнопкой вызова я подразумеваю, чтобы сначала нажималась кнопка "получить данные", потом когда получаешь данные давалась возможность изменить данные (добавить или удалить - 2 кнопки).

Надо сюда подключать еще работу с сессиями?

Выход из этого какой? Примерчика нет никакого? У меня по отдельности вроде бы еще получается что-то сделать, а все вместе соединить не могу. 
PM   Вверх
AntonSaburov
Дата 24.5.2015, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 8
Всего: 118



Настоятельно предлагаю все-таки для каждого вопроса открывать новый топик - может вам бы и другие помогли, но продираться сквозь все страницы и пытаться найти вопрос очень неудобно.
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0935 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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