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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XPATH парсинг 
:(
    Опции темы
ZeusX
  Дата 13.2.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте друзья,

помогите при помощи XPATH вытащить значения OPERATION_DATE, SQLCODE, RECEIPT


Код

<?xml version = "1.0" encoding = "windows-1251"?>
<!DOCTYPE KKM_PG_GATE SYSTEM "kkm_pg_gate.dtd">
<KKM_PG_GATE>
<OPERATION_DATE>XX.XX.XXXX XX:XX</OPERATION_DATE>
<ERROR SQLCODE="0" SQLERRM="ORA-0000: normal, successful completion"/>
    <PAY_SALE_TAX>0</PAY_SALE_TAX>
    <PAY_SALE_TAX_USD>0</PAY_SALE_TAX_USD>
<RECEIPTS>
  <RECEIPT>XXXXXX</RECEIPT>
</RECEIPTS>
</KKM_PG_GATE>

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



XPath'ы:
Код

/KKM_PG_GATE/OPERATION_DATE
/KKM_PG_GATE/ERROR/@SQLCODE
/KKM_PG_GATE/RECEIPTS/RECEIPT



--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
ZeusX
  Дата 14.2.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



воть код:

оцените

Код

public String getXPathValue( String xPathQuery, String xml ) {        
        String result = new String();
        StringReader stringReader = new StringReader( xml );        
        InputSource inputSource = new InputSource( stringReader );

        DocumentBuilderFactory dbfact = DocumentBuilderFactory.newInstance();
        dbfact.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
        
        DocumentBuilder builder = null;
        try {
            builder = dbfact.newDocumentBuilder();
        } catch (ParserConfigurationException ex) {
            ex.printStackTrace();
        }
        Document doc = null;
        try {
            doc = builder.parse(inputSource);
        } catch (SAXException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        
        XPathFactory factory = XPathFactory.newInstance();
        XPath xpath = factory.newXPath();
        
        try {
             result = (String) xpath.evaluate( xPathQuery, doc );
        } catch (XPathExpressionException ex) {
            ex.printStackTrace();
        }
        return result;
    }


. . . 

Код

        String date = getXPathValue( "/KKM_PG_GATE/OPERATION_DATE", xml );
        String code = getXPathValue( "/KKM_PG_GATE/ERROR/@SQLCODE", xml );
        String receipt = getXPathValue( "/KKM_PG_GATE/RECEIPTS/RECEIPT", xml );

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Ну, код можно сильно упростить:
Код

public String getXPathValue( String xPathQuery, String xml ) {
    String result = null; // нефиг создавать лишний объект
    InputSource inputSource = new InputSource( new StringReader( xml ) );
    DocumentBuilder builder = null;
    Document doc = null;
    XPath xpath = null;
    try {
        DocumentBuilderFactory dbfact = DocumentBuilderFactory.newInstance();
        dbfact.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
        builder = dbfact.newDocumentBuilder();
        doc = builder.parse(inputSource);
        xpath = XPathFactory.newInstance().newXPath();
        result = (String) xpath.evaluate( xPathQuery, doc );
    } catch (XPathExpressionException ex) {
        ex.printStackTrace();
    } catch (ParserConfigurationException ex) {
        ex.printStackTrace();
    } catch (SAXException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return result;
}



--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Hidrag
Дата 18.2.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



nornad, а какое значение имеет эта строка?
Код

dbfact.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);




--------------------
user posted image
PM WWW ICQ   Вверх
nornad
Дата 19.2.2008, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Вот уж чего не знаю - того не знаю smile
Оставил именно потому, что наверняка не знаю. Подозреваю, что это отключение подгрузки внешних DTD, но зачем, если итак в коде DTD явно не подгружается...


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
aranea
Дата 6.5.2008, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Приветы всем! Помогите разобраться с XPath
Ниже приведенный nornad'ом упрощенный код не работает. Задача (для меня) усложняется отсутствием комментариев на тему импорта: какие пакеты подключать и откуда скачивать.

вот как сделал я:

Код

import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;

import org.w3c.dom.*;
import org.xml.sax.*;

..............

  public void getXPathValue(String xPathQuery) {
    String result = null;
    System.out.println("begin: ");
    try {
      XPath xpath = XPathFactory.newInstance().newXPath();
      System.out.println("let's_try: ");
      result = xpath.evaluate(xPathQuery, document);
    }
    catch (XPathExpressionException ex) {
      ex.printStackTrace();
    }
  }

................
newParser.getXPathValue("//article[@date='1209725222']"));


void сделал на время.
Итак при вызове, "begin" выводит на консоль, а вот "let's_try:" уже никак, не доходит.
или умирает вот с таким сообщением
Код

java.lang.RuntimeException: XPathFactory#newInstance() failed to create an XPathFactory for the default object model: http://java.sun.com/jaxp/xpath/dom with the XPathFactoryConfigurationException: javax.xml.xpath.XPathFactoryConfigurationException: No XPathFactory implementation found for the object model: http://java.sun.com/jaxp/xpath/dom

    at javax.xml.xpath.XPathFactory.newInstance(XPathFactory.java:101)

    at XMLParserTest.main(XMLParserTest.java:23)

Exception in thread "main" 


так как javax.xml.xpath.XPath; по умолчанию не виделось, скачал и подключил jaxp-1_4 jaxp-api.jar там оно есть
DOM / SAX парсеры работают, но для полного счатья хочу сделать XPath.
и вообще что лучше использовать: org.apache.xalan, jdom или еще что...? Голова кругом
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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