powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / парсинг XML
32 сообщений из 32, показаны все 2 страниц
парсинг XML
    #39531319
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте всем!
есть xml файл который весит 2,5 ГБ, так вот содержимого этого файла надо записать в БД.

посоветуйте пожалуйста, куда копать? пока думаю воспользоваться с StAX...

а ещё там количество столбцов равно 101. )
...
Рейтинг: 0 / 0
парсинг XML
    #39531340
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,

Ну, с SAX возни много. StAX - оптимален для стандартного API. JAXB, по-моему, не стримится. Раньше для таких задач я использовал Apache Commons Digester - очень гибкая и удобная обертка над SAX. Единственный минус что замороченая немного. Въехать нужно. Но кода выходит минимум в результате.
...
Рейтинг: 0 / 0
парсинг XML
    #39531432
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

а объем не влияет на быстроту?
вроде как StAX может работать в нескольких потоках?
...
Рейтинг: 0 / 0
парсинг XML
    #39531439
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффара объем не влияет на быстроту?

Не понял вопроса. Для потоковых парсеров не влияет. Но зависит от того что вы делаете с результатом. Если вы его в память складываете, то может и повлиять.

Музаффарвроде как StAX может работать в нескольких потоках?
Не думаю. Может какие-то отдельно взятые реализации.
...
Рейтинг: 0 / 0
парсинг XML
    #39531481
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

так StAX потоковый или нет?

результат запись данных в БД

при этом этот xml выглядит прям как html таблица (т.е. <table><thead><tr><td>...</td></th></thead><tbody>...</tbody>)

З.Ы. сорри сюда не смог т.к. комп завис при открытия файла
...
Рейтинг: 0 / 0
парсинг XML
    #39531490
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффартак StAX потоковый или нет?

Потоковый.

Музаффаррезультат запись данных в БД

Тогда есть смысл разделить парсинг и запись в БД. Одним потоком читаешь и промежуточные результаты в очередь, а пулом потоков вытаскиваешь из очереди и в базу.
Потом попробовать увеличить размера пула и посмотреть. Писать в базу должно быть на много дороже.
...
Рейтинг: 0 / 0
парсинг XML
    #39531498
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар парсинг XML
Слова парсить и парсер не существуют. Но StAX подойдёт. Скорость у него линейно зависит от размера файла и составит немногочисленные минуты. Так что ничего оптимизировать не надо. Можно было бы вместо этого превратить XML в коллекцию Java объектов с помощью библиотеки Jackson или подобной. Этот способ сгодится, если уже есть знание, как пользоваться подобной библиотекой. Но в этом способе скорость работы может быть медленной для очень большого файла, и расход памяти может быть большим. Наконец, можно прочитать XML файл, разбивая его на группы строк, соответствующие элементам, каждую рассматривать кака отдельный XML и превращать в Java объект. Это позволит обработать и большой XML файл. Для маленького файла (до десятков или может быть сотен мегабайт) он не имеет смысла. В общем, можете осилить StAX - так и используйте его. Можно и SAX, если знаете его. Различие между StAX и SAX в скорости существует, но для вашей задачи (разовой работы) непринципиально.
...
Рейтинг: 0 / 0
парсинг XML
    #39531500
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возьми pentaho kettle pid (etl)
там есть готовый компоненты
...
Рейтинг: 0 / 0
парсинг XML
    #39531510
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
допустил опечатку. У StAX скорость работы не зависит от размера файла. Время работы линейно зависит от него.
...
Рейтинг: 0 / 0
парсинг XML
    #39531532
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за ответы, пойду попробую разобраться с StAX'ом, по мере необходимости буду спрашивать. ещё раз спасибо за советы!
...
Рейтинг: 0 / 0
парсинг XML
    #39531536
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати а что если воспользоваться с функциями СУБД к примеру у MySQL "load xml infile"?
...
Рейтинг: 0 / 0
парсинг XML
    #39531547
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingвозьми pentaho kettle pid (etl)

Этот способ может подойдёт, а может и нет - в зависимости от способа разбора XML файла, применённого в нём. Если используется StaX или SAX , то подойдёт. Но если там DOM parser (загружающий файл в память для разбора), то для большого файла этот способ не подойдёт. Не знаю, какой именно там. Можно конечно посмотреть исходный код Pentaho ETL или выяснить путём эксперимента.
...
Рейтинг: 0 / 0
парсинг XML
    #39531562
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan MЭтот способ может подойдёт, а может и нет
Pentaho всё умеет. Другое дело что устанавливать и поддерживать этот зоопарк ещё то веселье, особенно без аналогичного опыта. Уж проще единоразово на яве наклепать.
...
Рейтинг: 0 / 0
парсинг XML
    #39531582
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что скажете на счет этого метода?
https://dev.mysql.com/doc/refman/5.5/en/load-xml.html
...
Рейтинг: 0 / 0
парсинг XML
    #39531611
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффарчто скажете на счет этого метода?
https://dev.mysql.com/doc/refman/5.5/en/load-xml.html
Да хрен его... Надо в профильном форуме спрашивать. Зная MySQL можно предположить что работает, как всегда, через одно место.
...
Рейтинг: 0 / 0
парсинг XML
    #39531760
Музаффар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

вот содержимое выглядит примерно так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
<?xml version="1.0" encoding="UTF-8" ?> 
<table name="LMVBWEB_VAGON" originalSchema="LMVB" originalName="WEB_VAGON">
<thead>
<tr>
  <th comment="" type="INTEGER" typeNum="4" format="0">NVAG</th> 
  <th comment="" type="DATE" typeNum="91" format="yyyy-mm-dd">DATE_REG</th> 
  <th comment="" type="SMALLINT" typeNum="5" format="0">PRIC_REG</th> 
  <th comment="" type="SMALLINT" typeNum="5" format="0">SOB_REG</th> 
  <th comment="" type="SMALLINT" typeNum="5" format="0">DOR_REG</th> 
  <th comment="" type="SMALLINT" typeNum="5" format="0">DEPO_REG</th> 
  <th comment="" type="DATE" typeNum="91" format="yyyy-mm-dd">DATE_POST</th> 
  <th comment="" type="SMALLINT" typeNum="5" format="0">ZAV</th> 
  <th comment="" type="SMALLINT" typeNum="5" format="0">TIP</th> 
  <th comment="" type="SMALLINT" typeNum="5" format="0">MODEL_KOD</th> 
  <th comment="" type="CHAR" typeNum="1" format="text" length="10">MODEL</th>
</tr>
</thead>
<tbody>
<tr>
  <td>7738015</td> 
  <td>1998-03-04</td> 
  <td>0</td> 
  <td>0</td> 
  <td>0</td> 
  <td>0</td> 
  <td>0001-01-01</td> 
  <td>0</td> 
  <td>0</td> 
  <td>0</td> 
  <td /> 
</tr>
</tbody> 

...
Рейтинг: 0 / 0
парсинг XML
    #39531929
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Музаффар,

Ну да, StAX. Прочитать 10000 строк, сделать bulk insert, повторить.
...
Рейтинг: 0 / 0
парсинг XML
    #39532096
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan Mllemingвозьми pentaho kettle pid (etl)

Этот способ может подойдёт, а может и нет - в зависимости от способа разбора XML файла, применённого в нём. Если используется StaX или SAX , то подойдёт. Но если там DOM parser (загружающий файл в память для разбора), то для большого файла этот способ не подойдёт. Не знаю, какой именно там. Можно конечно посмотреть исходный код Pentaho ETL или выяснить путём эксперимента.

там готовые примеры для Stax парсинга
$BASEDIR/samples/transformations

правда немного разбираться все равно придется
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
парсинг XML
    #39910212
goliaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
package client10;

import java.io.File;
import java.io.IOException;

import static java.lang.System.out;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.xml.sax.SAXException;

/**
 * Validate provided XML against the provided XSDs.
 */
public class XmlValidator
{
   /**
    * Validate provided XML against the provided XSD schema files.
    *
    * @param xmlFilePathAndName Path/name of XML file to be validated;
    *    should not be null or empty.
    * @param xsdFilesPathsAndNames XSDs against which to validate the XML;
    *    should not be null or empty.
    */
   public static void validateXmlAgainstXsds(
      final String xmlFilePathAndName, final String[] xsdFilesPathsAndNames)
   {
      if (xmlFilePathAndName == null || xmlFilePathAndName.isEmpty())
      {
         out.println("ERROR: Path/name of XML to be validated cannot be null.");
         return;
      }
      if (xsdFilesPathsAndNames == null || xsdFilesPathsAndNames.length < 1)
      {
         out.println("ERROR: At least one XSD must be provided to validate XML against.");
         return;
      }
      final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
 
      final StreamSource[] xsdSources = generateStreamSourcesFromXsdPathsJdk8(xsdFilesPathsAndNames);
 
      try
      {
         final Schema schema = schemaFactory.newSchema(xsdSources);
         final Validator validator = schema.newValidator();
         out.println("Validating " + xmlFilePathAndName + " against XSDs "
            + Arrays.toString(xsdFilesPathsAndNames) + "...");
         validator.validate(new StreamSource(new File(xmlFilePathAndName)));
      }
      catch (IOException | SAXException exception)  // JDK 7 multi-exception catch
      {
         out.println(
            "ERROR: Unable to validate " + xmlFilePathAndName
            + " against XSDs " + Arrays.toString(xsdFilesPathsAndNames)
            + " - " + exception);
      }
      out.println("Validation process completed.");
   }
 
   /**
    * Generates array of StreamSource instances representing XSDs
    * associated with the file paths/names provided and use JDK 8
    * Stream API.
    *
    * This method can be commented out if using a version of
    * Java prior to JDK 8.
    *
    * @param xsdFilesPaths String representations of paths/names
    *    of XSD files.
    * @return StreamSource instances representing XSDs.
    */
   private static StreamSource[] generateStreamSourcesFromXsdPathsJdk8(
      final String[] xsdFilesPaths)
   {
      return Arrays.stream(xsdFilesPaths)
                   .map(StreamSource::new)
                   .collect(Collectors.toList())
                   .toArray(new StreamSource[xsdFilesPaths.length]);
   }
 
   /**
    * Generates array of StreamSource instances representing XSDs
    * associated with the file paths/names provided and uses
    * pre-JDK 8 Java APIs.
    *
    * This method can be commented out (or better yet, removed
    * altogether) if using JDK 8 or later.
    *
    * @param xsdFilesPaths String representations of paths/names
    *    of XSD files.
    * @return StreamSource instances representing XSDs.
    * @deprecated Use generateStreamSourcesFromXsdPathsJdk8 instead
    *    when JDK 8 or later is available.
    */
   @Deprecated
   private static StreamSource[] generateStreamSourcesFromXsdPathsJdk7(
      final String[] xsdFilesPaths)
   {
      // Diamond operator used here requires JDK 7; add type of
      // StreamSource to generic specification of ArrayList for
      // JDK 5 or JDK 6
      final List<StreamSource> streamSources = new ArrayList<>();
      for (final String xsdPath : xsdFilesPaths)
      {
         streamSources.add(new StreamSource(xsdPath));
      }
      return streamSources.toArray(new StreamSource[xsdFilesPaths.length]);
   }
 
   /**
    * Validates provided XML against provided XSD.
    *
    * @param arguments XML file to be validated (first argument) and
    *    XSD against which it should be validated (second and later
    *    arguments).
    */
   public static void main(final String[] arguments)
   {
      if (arguments.length < 2)
      {
         out.println("\nUSAGE: java XmlValidator <xmlFile> <xsdFile1> ... <xsdFileN>\n");
         out.println("\tOrder of XSDs can be significant (place XSDs that are");
         out.println("\tdependent on other XSDs after those they depend on)");
         System.exit(-1);
      }
      // Arrays.copyOfRange requires JDK 6; see
      // http://stackoverflow.com/questions/7970486/porting-arrays-copyofrange-from-java-6-to-java-5
      // for additional details for versions of Java prior to JDK 6.
      final String[] schemas = Arrays.copyOfRange(arguments, 1, arguments.length);
      validateXmlAgainstXsds(arguments[0], schemas);
   }
}
...
Рейтинг: 0 / 0
парсинг XML
    #39910215
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй теги, Голиафик
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
package client10;

import java.io.File;
import java.io.IOException;

import static java.lang.System.out;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.xml.sax.SAXException;

/**
 * Validate provided XML against the provided XSDs.
 */
public class XmlValidator
{
   /**
    * Validate provided XML against the provided XSD schema files.
    *
    * @param xmlFilePathAndName Path/name of XML file to be validated;
    *    should not be null or empty.
    * @param xsdFilesPathsAndNames XSDs against which to validate the XML;
    *    should not be null or empty.
    */
   public static void validateXmlAgainstXsds(
      final String xmlFilePathAndName, final String[] xsdFilesPathsAndNames)
   {
      if (xmlFilePathAndName == null || xmlFilePathAndName.isEmpty())
      {
         out.println("ERROR: Path/name of XML to be validated cannot be null.");
         return;
      }
      if (xsdFilesPathsAndNames == null || xsdFilesPathsAndNames.length < 1)
      {
         out.println("ERROR: At least one XSD must be provided to validate XML against.");
         return;
      }
      final SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
 
      final StreamSource[] xsdSources = generateStreamSourcesFromXsdPathsJdk8(xsdFilesPathsAndNames);
 
      try
      {
         final Schema schema = schemaFactory.newSchema(xsdSources);
         final Validator validator = schema.newValidator();
         out.println("Validating " + xmlFilePathAndName + " against XSDs "
            + Arrays.toString(xsdFilesPathsAndNames) + "...");
         validator.validate(new StreamSource(new File(xmlFilePathAndName)));
      }
      catch (IOException | SAXException exception)  // JDK 7 multi-exception catch
      {
         out.println(
            "ERROR: Unable to validate " + xmlFilePathAndName
            + " against XSDs " + Arrays.toString(xsdFilesPathsAndNames)
            + " - " + exception);
      }
      out.println("Validation process completed.");
   }
 
   /**
    * Generates array of StreamSource instances representing XSDs
    * associated with the file paths/names provided and use JDK 8
    * Stream API.
    *
    * This method can be commented out if using a version of
    * Java prior to JDK 8.
    *
    * @param xsdFilesPaths String representations of paths/names
    *    of XSD files.
    * @return StreamSource instances representing XSDs.
    */
   private static StreamSource[] generateStreamSourcesFromXsdPathsJdk8(
      final String[] xsdFilesPaths)
   {
      return Arrays.stream(xsdFilesPaths)
                   .map(StreamSource::new)
                   .collect(Collectors.toList())
                   .toArray(new StreamSource[xsdFilesPaths.length]);
   }
 
   /**
    * Generates array of StreamSource instances representing XSDs
    * associated with the file paths/names provided and uses
    * pre-JDK 8 Java APIs.
    *
    * This method can be commented out (or better yet, removed
    * altogether) if using JDK 8 or later.
    *
    * @param xsdFilesPaths String representations of paths/names
    *    of XSD files.
    * @return StreamSource instances representing XSDs.
    * @deprecated Use generateStreamSourcesFromXsdPathsJdk8 instead
    *    when JDK 8 or later is available.
    */
   @Deprecated
   private static StreamSource[] generateStreamSourcesFromXsdPathsJdk7(
      final String[] xsdFilesPaths)
   {
      // Diamond operator used here requires JDK 7; add type of
      // StreamSource to generic specification of ArrayList for
      // JDK 5 or JDK 6
      final List<StreamSource> streamSources = new ArrayList<>();
      for (final String xsdPath : xsdFilesPaths)
      {
         streamSources.add(new StreamSource(xsdPath));
      }
      return streamSources.toArray(new StreamSource[xsdFilesPaths.length]);
   }
 
   /**
    * Validates provided XML against provided XSD.
    *
    * @param arguments XML file to be validated (first argument) and
    *    XSD against which it should be validated (second and later
    *    arguments).
    */
   public static void main(final String[] arguments)
   {
      if (arguments.length < 2)
      {
         out.println("\nUSAGE: java XmlValidator <xmlFile> <xsdFile1> ... <xsdFileN>\n");
         out.println("\tOrder of XSDs can be significant (place XSDs that are");
         out.println("\tdependent on other XSDs after those they depend on)");
         System.exit(-1);
      }
      // Arrays.copyOfRange requires JDK 6; see
      // http://stackoverflow.com/questions/7970486/porting-arrays-copyofrange-from-java-6-to-java-5
      // for additional details for versions of Java prior to JDK 6.
      final String[] schemas = Arrays.copyOfRange(arguments, 1, arguments.length);
      validateXmlAgainstXsds(arguments[0], schemas);
   }
}

...
Рейтинг: 0 / 0
парсинг XML
    #39910280
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goliaf,

Что это за портянка?xml against xsd в 2020 валидируется двумя строчками .за такую портянку в наше время нужно бить,причём бить сильно и желательно по рукам)
...
Рейтинг: 0 / 0
парсинг XML
    #39975282
goliaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
/*
CREATE OR REPLACE PROCEDURE test_new_8(xsd clob, xml clob, b out VARCHAR2, c out VARCHAR2)
AS LANGUAGE JAVA
NAME 'TestNew_8.testNew_8(oracle.sql.CLOB , oracle.sql.CLOB , java.lang.String [], java.lang.String[])';

*/
create or replace and compile java source named TestNew_8 as

import javax.xml.parsers.SAXParser; import java.sql.Clob; import java.io.StringReader;
import javax.xml.parsers.SAXParserFactory; import java.sql.SQLException; import java.io.Writer;
import java.lang.String; import java.io.Reader;
import org.xml.sax.Attributes; import oracle.sql.CLOB; import java.io.BufferedReader;
import org.xml.sax.SAXException; import java.io.IOException;
import org.xml.sax.helpers.DefaultHandler; import java.io.InputStream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.ByteArrayInputStream;

import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import java.io.File;
import java.io.StringReader;
import javax.xml.transform.stream.StreamSource;

import java.io.FileReader;
import java.lang.SecurityException;

import org.w3c.dom.ls.LSInput;
import org.w3c.dom.ls.LSResourceResolver;

public class TestNew_8 {
public static void testNew_8( oracle.sql.CLOB xsd
, oracle.sql.CLOB xml
, java.lang.String [] b
, java.lang.String [] c
)
throws SQLException, IOException, SAXException {

String start = "start" ;

try {


try {
// File inputFile = new File("//u99//ibsodc//utlfile//ibs//tmp//T_MAP_9962164.log ");

BufferedReader reader = new BufferedReader( new FileReader ("//u99//ibsodc//utlfile//ibs//tmp//T_MAP_9962164.log"));
// BufferedReader reader = new BufferedReader( new FileReader ("//localhost//inst_102_cft_bss.log"));

String line = null;
StringBuilder stringBuilder = new StringBuilder();


while( ( line = reader.readLine() ) != null ) {
stringBuilder.append( line );

}

b[0] = line;
//



SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
Reader is = xml.getCharacterStream();
BufferedReader br = new BufferedReader(is);
String s = br.readLine();
// b[0] = "start";
c[0] = "start";


//********************************** 19/12/2019 ***************************************

SchemaFactory schemaFactory = SchemaFactory.newInstance(" http://www.w3.org/2001/XMLSchema");
// StringReader reader_xsd = new StringReader(s);
// StreamSource streamSource = new StreamSource(reader_xsd);
StreamSource streamSourceXSD = new StreamSource(xsd.getCharacterStream());
// Создание валидатора
Schema schema = schemaFactory.newSchema(streamSourceXSD);
Validator validator = schema.newValidator();
StreamSource streamSourceXML = new StreamSource(xml.getCharacterStream());
validator.validate(streamSourceXML);

//***************************************************************************

c[0] = "SAXException Is valid";
}
catch (SAXException | SQLException | IOException ex) {
c[0] = "SAX|SQL|IO Is invalid. Err: " + ex + "!" ;
}

c[0] = "Exception Is valid";
}
catch (Exception e) {
c[0] = "Exception Is invalid. Err: " + e ;
}

}

}


--###################################################


declare
b varchar2(32000);
c varchar2(32000);
v_clob_xml clob;
v_clob_xsd clob;
t number;
begin

v_clob_xsd := '<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs=" http://www.w3.org/2001/XMLSchema">
<xs:element name="CIT_REQUEST">
<xs:element name="SYTEM">
<xs:complexType>
<xs:sequence>
<xs:element name="book" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="genre" use="optional"/>
<xs:attribute type="xs:date" name="publicationdate" use="optional"/>
<xs:attribute type="xs:string" name="ISBN" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>';

select c_XML
into v_clob_xml
from ibs.z#mts_xsd_control
where c_num = 2;


test_new_8( v_clob_xsd, v_clob_xml, b, c);
t := length(b);
dbms_output.put_line('...............Вывод test_new_8.........');
dbms_output.put_line('Вывод b...'||b);
dbms_output.put_line('Вывод c...'||c);
dbms_output.put_line('Длина t...'||t);

end;
...
Рейтинг: 0 / 0
парсинг XML
    #39975297
goliaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goliaf,

declare
type t_my_tab is table of varchar2(2000) INDEX BY PLS_INTEGER;
my_tab t_my_tab;
idx integer;
begin


select code
bulk collect into my_tab
from t_map_1 order by user_name asc fetch first 2 row with ties;
idx:= my_tab.first;

while idx is not null
loop
dbms_output.put_line(idx || ' = ' ||my_tab(idx));
idx := my_tab.next(idx);
end loop;



end;
...
Рейтинг: 0 / 0
парсинг XML
    #39975300
goliaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goliaf,
-- Если нашли одну запись выбираем ее
-- Если нашли больше одной записи, то сортируем и выбираем вторую
-- Вывод поля varchar2(4000)
declare
type t_my_tab is table of varchar2(4000) index by pls_integer;
my_tab t_my_tab;
idx integer;

begin

select lead(object_name,1,object_name) over( order by object_id asc )
bulk collect into my_tab
from all_objects
where owner = 'SYS'
order by object_id asc
fetch first 2 row with ties;

dbms_output.put_line('Выбрали: ' || my_tab(1));
idx:= my_tab.first;
while idx is not null
loop
dbms_output.put_line('Массив.....'||idx || ' = ' ||my_tab(idx));
idx := my_tab.next(idx);
end loop;




exception when no_data_found then
dbms_output.put_line(' Данные не найдены ' );
end;
...
Рейтинг: 0 / 0
парсинг XML
    #39975309
goliaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goliaf,
SELECT XMLSERIALIZE(
DOCUMENT
XMLELEMENT(
"ORGANIZATION",
XMLELEMENT(
"DEPARTMENTS",
XMLAGG(
XMLELEMENT(
"DEPARTMENT",
XMLELEMENT(
"NUMBER",
D.DEPTNO
),
XMLELEMENT(
"NAME",
MAX(D.DNAME)
),
XMLELEMENT(
"LOCATION",
MAX(D.LOC)
),
XMLELEMENT(
"EMPLOYEES",
XMLAGG(
XMLELEMENT(
"EMPLOYEE",
XMLELEMENT(
"EMPNO",
E.EMPNO
),
XMLELEMENT(
"ENAME",
E.ENAME
),
XMLELEMENT(
"JOB",
E.JOB
),
XMLELEMENT(
"SAL",
E.SAL
)
)
)
)
)
)
)
)
INDENT
SIZE = 2
) ORGANIZATION
FROM DEPT D,
EMP E
WHERE E.DEPTNO = D.DEPTNO
GROUP BY D.DEPTNO
...
Рейтинг: 0 / 0
парсинг XML
    #39975312
goliaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goliaf,
--1 инициализация wm_concat
--declare r number := rtl.open(); begin executor.set_context('WM_CONCAT_DELIM',chr(10)); end;
/*
create or replace procedure wm_concat_init(p_separator in varchar2 default ',')
is
r number := rtl.open();
begin
executor.set_context('WM_CONCAT_DELIM', p_separator);
end;
*/
/*
begin
wm_concat_init(chr(10));
end;
/
*/
--2 скрипт получения объектов

select
'VER2'||chr(10)||
'REM Список элементов'||chr(10)||
'REM IBS@IBSODC'||chr(10)||
'REM Версия ТЯ: 7.4.5.4'||chr(10)||
'REM Версия Администратора проектов: 6.93.0.107'||chr(10)||
''||chr(10)||
wm_concat(c_type_obj||' '||c_class||' '||regexp_replace(c_obj,'chr(13)|chr(10)',' ')) c_pck
from
(

select
c_modified_time as c_modified_time,
user_modified,
c_class_id as c_type_obj,
meth_class as c_class,
case
when c_class_id in ('ATR','IDX', 'TYPE') then
c_text
else meth_name
end as c_obj,
c_text
from
(
select
x.sname as c_class_meth
, x.c_modified_time as c_modified_time
, x.Class_Id as c_Class_Id
, x.meth_class as meth_class
, x.meth_name as meth_name
, x.action as c_action
, x.topic as c_topic
, x.what as c_what
, x.text as c_text
, user_modified

from
(
with ls as
(
select /*+ MATERIALIZE*/ *
from
(
SELECT
a1.CODE ID, a1.O_TYPE Class_Id,
m.user_modified user_modified,
a1.USER_ID C_USER,
a1.TIME C_TIME,
nvl(m.modified, a1.TIME) c_modified_time,
case when a1.WHAT in ('DROP','DELETE') then 'DROP' when a1.WHAT in ('CREATE','INSERTED') then 'ADD' when a1.WHAT in ('ERROR','COMPILE','UPDATED','REBUILDED') then 'EDIT' else 'OTHER' end ACTION,
a1.TOPIC TOPIC,
a1.SNAME SNAME,
a1.WHAT WHAT,
a1.TEXT TEXT,
a1.meth_class,
a1.meth_name
from (
select b1.TIME TIME, b1.USER_ID USER_ID, b1.CODE CODE, b1.TOPIC TOPIC, b1.O_TYPE O_TYPE, b1.SNAME SNAME, b1.TEXT TEXT, b1.WHAT WHAT, FIRST_VALUE(b1.WHAT) over (partition by b1.USER_ID, b1.O_TYPE, b1.CODE order by case when b1.WHAT in ('DROP','DELETE','CREATE','INSERTED') then 1 when b1.WHAT in ('ERROR','COMPILE','UPDATED','REBUILDED') then 2 else 5 end asc, b1.TIME desc) MADE, FIRST_VALUE(b1.TIME) over (partition by b1.USER_ID, b1.O_TYPE, b1.CODE, b1.WHAT order by b1.TIME desc) MADETIME
, trim(regexp_replace(replace(replace(b1.SNAME, chr(10),''), chr(13), ''),'([a-zA-Z0-9_#]*)\.([a-zA-Z0-9_#]*)(.*)|( - .*)','\1')) meth_class
, trim(regexp_replace(replace(replace(b1.SNAME, chr(10),''), chr(13), ''),'([a-zA-Z0-9_#]*)\.([a-zA-Z0-9_#]*)(.*)|( - .*)','\2')) meth_name
from (
select c1.TIME TIME, c1.USER_ID USER_ID, c1.METHOD_ID CODE, 'M' TOPIC, 'METH' O_TYPE, c1.SNAME SNAME, c1.NAME TEXT, c1.ACTION WHAT
from DIARY_METHODS c1
union all
select d1.TIME TIME, d1.USER_ID USER_ID, d1.METHOD_ID CODE, d1.TOPIC TOPIC, 'METH' O_TYPE, d1.MNAME SNAME, d1.TEXT TEXT, d1.ACTION WHAT
from DIARY_PARAM_VARS d1
union all
select e1.TIME TIME, e1.USER_ID USER_ID, e1.METHOD_ID CODE, 'F' TOPIC, 'METH' O_TYPE, e1.MNAME SNAME, e1.NAME TEXT, e1.ACTION WHAT
from DIARY_FORMS e1
union all
select f1.TIME TIME, f1.USER_ID USER_ID, f1.CRITERIA_ID CODE, 'C' TOPIC, 'CRIT' O_TYPE, f1.SNAME SNAME, f1.NAME TEXT, f1.ACTION WHAT
from DIARY_CRITERIA f1
union all
select g1.TIME TIME, g1.USER_ID USER_ID, g1.CLASS_ID CODE, 'B' TOPIC, 'TYPE' O_TYPE, g1.CLASS_ID SNAME, g1.NAME TEXT, g1.ACTION WHAT
from DIARY_STORAGE g1
union all
select h1.TIME TIME, h1.USER_ID USER_ID, h1.CLASS_ID CODE, h1.TOPIC TOPIC, 'IDX' O_TYPE, h1.CLASS_ID SNAME, h1.TEXT TEXT, h1.ACTION WHAT
from DIARY_STORAGE_EXT h1
union all
select i1.TIME TIME, i1.USER_ID USER_ID, i1.CLASS_ID CODE, i1.TOPIC TOPIC, 'ATR' O_TYPE, i1.CLASS_ID SNAME, i1.TEXT TEXT, i1.ACTION WHAT
from DIARY_ATTRIBUTES i1
) b1
where (&P_USER_BEG is null or UPPER(b1.USER_ID) = UPPER(&<name = "P_USER_BEG" default ="'IBS.MBelin'"> ))
and b1.time >= &<name = "P_DATE_BEG" default ="to_date('25/09/2015','DD/MM/YYYY')">
order by b1.USER_ID,b1.O_TYPE,b1.CODE,b1.TIME
) a1 , methods m
where a1.WHAT = a1.MADE and a1.MADETIME = a1.TIME
and a1.meth_class = m.class_id (+)
and a1.meth_name = m.short_name (+)
and (m.user_modified is null or instr(a1.USER_ID, m.user_modified) > 0)
)
--where trunc(c_time) = trunc(c_modified_time)
-- where what <> 'COMPILE'
order by c_time
)
select * from ls
where (&<name = "P_NUM_ZI" default ="''"> is null or (class_id <> 'METHODS' or (class_id = 'METHODS' and exists (select 1 from sources b where b.name = ls.id and instr(b.text, &P_NUM_ZI) > 0 ))))
-- не дистрибутив
and not exists(select 1 from OBJECTS_OPTIONS zz where zz.class_id = ls.meth_class and zz.short_name = ls.meth_name and rownum = 1)
and ls.c_modified_time >= &<name = "P_DATE_BEG" default ="to_date('26/09/2017','DD/MM/YYYY')">
order by c_modified_time desc
) x
-- group by x.sname
)
order by c_modified_time desc
)
...
Рейтинг: 0 / 0
парсинг XML
    #39975327
goliaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
test
...
Рейтинг: 0 / 0
парсинг XML
    #39975365
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goliaf, ну и кто будет в ваших портянках разбираться?
Оформите по-человечески.
Подсказка - "SRC" и "Прочее/spoiler"
...
Рейтинг: 0 / 0
парсинг XML
    #39975545
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что тут мля вообще происходит
...
Рейтинг: 0 / 0
парсинг XML
    #39975620
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goliaf, чувак тебе уже несколько раз просили. Когда постишь исходники - обрамаляй их тегами.

Прояви уважение к тем кто тебе помогает.
...
Рейтинг: 0 / 0
парсинг XML
    #39976845
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Partisan M
llemingвозьми pentaho kettle pid (etl)


Этот способ может подойдёт, а может и нет - в зависимости от способа разбора XML файла, применённого в нём. Если используется StaX или SAX , то подойдёт. Но если там DOM parser (загружающий файл в память для разбора), то для большого файла этот способ не подойдёт. Не знаю, какой именно там. Можно конечно посмотреть исходный код Pentaho ETL или выяснить путём эксперимента.
кто ж такие файлы домом парсит
...
Рейтинг: 0 / 0
парсинг XML
    #39978213
Фотография Richard18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не знаю в теме пишу или нет, подскажите книги норм по java
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / парсинг XML
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]