Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Разбор XML с помощью SAX...  [new]
prizma
Member

Откуда:
Сообщений: 19
Добрый день...
У меня вопрос состоит в следующем разбирая документ XML при помощи SAX процессора заметил, что событие characters вызывается несколько раз для элемента который содержит символьное представление " либо ' (& quot; (естественно без пробела))

те.
предположим имеется элемент:
<subscriber_name>test & quot; XXXXXXXXXXXXXXX & quot;</ыubscriber_name>

значение которое должно быть записано в БД s_name должно содержать
s_name = test " XXXXXXXXXXXXXXX "

и это правильно но в итоге получаем что
s_name = "
Возможен поступить вот следующим образом
переписать обработчик вот так:

public void characters(char[] ch, int start, int length) {
    try {
// Subscriber

      if (currentelement == "subscriber_name") {

        s_name = s_name + new String(ch, start, length);
      }
//.......................
}
    catch (Exception e) {
      System.out.println("Исключение при получении значения узла: " + e);
      return;
    }
  }

Но может есть другой путь или я не так что делаю...


create or replace and compile java source named "xml_ct"as
import java.io.*;
import java.net.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import oracle.xml.parser.v2.*;

public class load_xml
    extends HandlerBase {
  String currentelement;
  String addrtype;
  String o_date;
  String s_id;
  String s_name;
  String s_legent;
  String s_cat;
  String s_inn;
  String s_kpp;
  String s_okpo;
  String s_okved;
  String s_contrnum;
  String s_contrdat;

  public static void pStart(String argv) {
    try {
      Parser parser = new SAXParser();
      load_xml loadxml = new load_xml();

      parser.setDocumentHandler(loadxml);

      InputSource xmldoc = new InputSource(new FileInputStream(argv));

      parser.parse(xmldoc);

      return;
    }
    catch (Exception e) {
      System.out.println("Исключение при инициализации парсера: " + e);
      return;
    }
  }

  public void startElement(String name, AttributeList atts) {
    try {
      currentelement = name;

      if (name == "insert") {
        o_date = atts.getValue(0);
      }

      if (name == "subscriber") {
        s_id = atts.getValue(0);
      }
    }
    catch (Exception e) {
      System.out.println("Исключение в методе startElement: " + e);
      return;
    }
  }

  public void characters(char[] ch, int start, int length) {
    try {
// Subscriber

      if (currentelement == "subscriber_name") {
        s_name = new String(ch, start, length);
      }

      if (currentelement == "legal_entity") {
        s_legent = new String(ch, start, length);
      }

      if (currentelement == "category") {
        s_cat = new String(ch, start, length);
      }

      if (currentelement == "inn") {
        s_inn = new String(ch, start, length);
      }

      if (currentelement == "kpp") {
        s_kpp = new String(ch, start, length);
      }

      if (currentelement == "okpo") {
        s_okpo = new String(ch, start, length);
      }

      if (currentelement == "okved") {
        s_okved = new String(ch, start, length);
      }

      if (currentelement == "contract_number") {
        s_contrnum = new String(ch, start, length);
      }

      if (currentelement == "contract_date") {
        s_contrdat = new String(ch, start, length);
      }
    }
    catch (Exception e) {
      System.out.println("Исключение при получении значения узла: " + e);
      return;
    }
  }

  public void endElement(String name) {
    try {
      if (name == "insert") {
        #sql {
            insert into subscriber(subscriber_id, lastdate, subscriber_name,
                                   legal_entity,
                                   category, inn, kpp, okpo, okved,
                                   contract_number, contract_date)
            values( : s_id,
                   to_date( : o_date, 'YYYY - MM - DD "T"HH24 : MI : SS '),
                           : s_name, : s_legent,
                           : s_cat, : s_inn, : s_kpp, : s_okpo, : s_okved,
                           : s_contrnum,
                           to_date( : s_contrdat,
                                   'YYYY - MM - DD "T"HH24 : MI : SS '))
        };
        o_date = "";
        s_id = "";
        s_name = "";
        s_legent = "";
        s_cat = "";
        s_inn = "";
        s_kpp = "";
        s_okpo = "";
        s_okved = "";
        s_contrnum = "";
        s_contrdat = "";

      }
    }
    catch (Exception e) {
      System.out.println("Исключение в методе endElement: " + e);
      return;
    }
  }

  public void endDocument() {
    System.out.println("Разбор документа окончен");
  }
}

/

    create or replace
    procedure load_from_xml(fn in varchar2) as
    language java
    name 'load_xml.pStart(java.lang.String)';
    /
CREATE TABLE Subscriber (
       Subscriber_ID        VARCHAR2(15) NOT NULL,
       Actual               NUMBER NULL,
       cFilial              VARCHAR2(20) NOT NULL,
       DateF                DATE NULL,
       cUser                VARCHAR2(20) NULL,
       DateL                DATE NULL,
       LastDate             DATE NULL,
       Subscriber_Name      VARCHAR2(255) NULL,
       Legal_entity         CHAR(1) NOT NULL,
       Category             CHAR(1) NOT NULL,
       INN                  VARCHAR2(12) NULL,
       KPP                  VARCHAR2(9) NULL,
       OKPO                 VARCHAR2(20) NULL,
       OKVED                VARCHAR2(20) NULL,
       Contract_number      VARCHAR2(15) NULL,
       Contract_date        DATE NULL
);


  • К сообщению приложен файл (18_0002.DAT - 817bytes) cкачать
  • 20 фев 06, 15:22    [2374422]     Ответить | Цитировать Сообщить модератору
     Re: Разбор XML с помощью SAX...  [new]
    Denis Popov
    Member

    Откуда: Санкт-Петербург
    Сообщений: 7862
    prizma
    Но может есть другой путь или я не так что делаю...

    ИМХО так и делается. Для красоты разве что можно использовать StringBuffer для накопления в нем значений: в методе characters() дополнять его значениями.
    StringBuffer buffer = new StringBuffer();
    ...
    public void characters(char[] ch, int start, int length) {
      buffer.append(ch, start, length);
    }
    
    20 фев 06, 16:11    [2374726]     Ответить | Цитировать Сообщить модератору
    Между сообщениями интервал более 1 года.
     Re: Разбор XML с помощью SAX...  [new]
    Diux
    Member

    Откуда:
    Сообщений: 6
    А что делать дальше ) Ну вот написал я эти Java функции. В PLSQL у меня есть clob огромный вот надо его разпарсить. Что я должен написать ? кого вызвать ?
    8 сен 09, 14:05    [7631682]     Ответить | Цитировать Сообщить модератору
     Re: Разбор XML с помощью SAX...  [new]
    Diux
    Member

    Откуда:
    Сообщений: 6
    Так мне и не ответили - ответ таков :
    файл положить на сервер, и запустить

    begin
    dbms_java.set_output(100000);
    load_from_xml('путь к файлу/2.xml');
    end;

    при этом может материться что нет прав, и тогда надо будет еще забахать

    BEGIN
    dbms_java.grant_permission( ' ', 'SYS:java.io.FilePermission', ' / ', 'read' );
    end;
    9 сен 09, 10:40    [7635534]     Ответить | Цитировать Сообщить модератору
     Re: Разбор XML с помощью SAX...  [new]
    Diux
    Member

    Откуда:
    Сообщений: 6
    Diux
    Так мне и не ответили - ответ таков :
    файл положить на сервер, и запустить

    begin
    dbms_java.set_output(100000);
    load_from_xml('путь к файлу/2.xml');
    end;

    при этом может материться что нет прав, и тогда надо будет еще забахать

    BEGIN
    dbms_java.grant_permission( ' ', 'SYS:java.io.FilePermission', ' / ', 'read' );
    end;


    * load_from_xml(' put' k faily /2.xml');
    * dbms_java.grant_permission( ' vash user ', 'SYS:java.io.FilePermission', ' put' k faily / imya faila ', 'read' );
    9 сен 09, 10:42    [7635551]     Ответить | Цитировать Сообщить модератору
     Re: Разбор XML с помощью SAX...  [new]
    mss_riddler
    Member

    Откуда:
    Сообщений: 25
    Diux,

    Извините, что вмешиваюсь со своим вопросом. У меня задача аналогичная. Только мне надо подставлять контент xml а не путь до него. Как это сделать? Примеров не нашла в инете.
    5 апр 10, 13:05    [8579258]     Ответить | Цитировать Сообщить модератору
     Re: Разбор XML с помощью SAX...  [new]
    Data Type
    Guest
    mss_riddler,

    а контент у вас в файле ? или где он у вас хранится ?
    5 апр 10, 14:37    [8580089]     Ответить | Цитировать Сообщить модератору
     Re: Разбор XML с помощью SAX...  [new]
    mss_riddler
    Member

    Откуда:
    Сообщений: 25
    Data Type,
    контент xml выдергивается из потока с помощью dbms_aq и на входе получается стринг.
    6 апр 10, 10:58    [8584043]     Ответить | Цитировать Сообщить модератору
     Re: Разбор XML с помощью SAX...  [new]
    mss_riddler
    Member

    Откуда:
    Сообщений: 25
    Data Type,
    Тоесть Контент не в файле. Он динамический - каждый раз разный.
    6 апр 10, 11:06    [8584134]     Ответить | Цитировать Сообщить модератору
    Все форумы / Oracle Ответить