|
парсинг XML
|
|||
---|---|---|---|
#18+
Здравствуйте всем! есть xml файл который весит 2,5 ГБ, так вот содержимого этого файла надо записать в БД. посоветуйте пожалуйста, куда копать? пока думаю воспользоваться с StAX... а ещё там количество столбцов равно 101. ) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 11:24 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
Музаффар, Ну, с SAX возни много. StAX - оптимален для стандартного API. JAXB, по-моему, не стримится. Раньше для таких задач я использовал Apache Commons Digester - очень гибкая и удобная обертка над SAX. Единственный минус что замороченая немного. Въехать нужно. Но кода выходит минимум в результате. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 11:39 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
Blazkowicz, а объем не влияет на быстроту? вроде как StAX может работать в нескольких потоках? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 13:14 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
Музаффара объем не влияет на быстроту? Не понял вопроса. Для потоковых парсеров не влияет. Но зависит от того что вы делаете с результатом. Если вы его в память складываете, то может и повлиять. Музаффарвроде как StAX может работать в нескольких потоках? Не думаю. Может какие-то отдельно взятые реализации. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 13:21 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
Blazkowicz, так StAX потоковый или нет? результат запись данных в БД при этом этот xml выглядит прям как html таблица (т.е. <table><thead><tr><td>...</td></th></thead><tbody>...</tbody>) З.Ы. сорри сюда не смог т.к. комп завис при открытия файла ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 14:02 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
Музаффартак StAX потоковый или нет? Потоковый. Музаффаррезультат запись данных в БД Тогда есть смысл разделить парсинг и запись в БД. Одним потоком читаешь и промежуточные результаты в очередь, а пулом потоков вытаскиваешь из очереди и в базу. Потом попробовать увеличить размера пула и посмотреть. Писать в базу должно быть на много дороже. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 14:20 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
Музаффар парсинг XML Слова парсить и парсер не существуют. Но StAX подойдёт. Скорость у него линейно зависит от размера файла и составит немногочисленные минуты. Так что ничего оптимизировать не надо. Можно было бы вместо этого превратить XML в коллекцию Java объектов с помощью библиотеки Jackson или подобной. Этот способ сгодится, если уже есть знание, как пользоваться подобной библиотекой. Но в этом способе скорость работы может быть медленной для очень большого файла, и расход памяти может быть большим. Наконец, можно прочитать XML файл, разбивая его на группы строк, соответствующие элементам, каждую рассматривать кака отдельный XML и превращать в Java объект. Это позволит обработать и большой XML файл. Для маленького файла (до десятков или может быть сотен мегабайт) он не имеет смысла. В общем, можете осилить StAX - так и используйте его. Можно и SAX, если знаете его. Различие между StAX и SAX в скорости существует, но для вашей задачи (разовой работы) непринципиально. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 14:29 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
возьми pentaho kettle pid (etl) там есть готовый компоненты ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 14:30 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
допустил опечатку. У StAX скорость работы не зависит от размера файла. Время работы линейно зависит от него. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 14:36 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
спасибо за ответы, пойду попробую разобраться с StAX'ом, по мере необходимости буду спрашивать. ещё раз спасибо за советы! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 14:56 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
кстати а что если воспользоваться с функциями СУБД к примеру у MySQL "load xml infile"? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 14:59 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
llemingвозьми pentaho kettle pid (etl) Этот способ может подойдёт, а может и нет - в зависимости от способа разбора XML файла, применённого в нём. Если используется StaX или SAX , то подойдёт. Но если там DOM parser (загружающий файл в память для разбора), то для большого файла этот способ не подойдёт. Не знаю, какой именно там. Можно конечно посмотреть исходный код Pentaho ETL или выяснить путём эксперимента. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 15:14 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
Partisan MЭтот способ может подойдёт, а может и нет Pentaho всё умеет. Другое дело что устанавливать и поддерживать этот зоопарк ещё то веселье, особенно без аналогичного опыта. Уж проще единоразово на яве наклепать. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 15:22 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
что скажете на счет этого метода? https://dev.mysql.com/doc/refman/5.5/en/load-xml.html ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 15:56 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
Музаффарчто скажете на счет этого метода? https://dev.mysql.com/doc/refman/5.5/en/load-xml.html Да хрен его... Надо в профильном форуме спрашивать. Зная MySQL можно предположить что работает, как всегда, через одно место. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 16:19 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 18:41 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
Музаффар, Ну да, StAX. Прочитать 10000 строк, сделать bulk insert, повторить. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2017, 08:13 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
Partisan Mllemingвозьми pentaho kettle pid (etl) Этот способ может подойдёт, а может и нет - в зависимости от способа разбора XML файла, применённого в нём. Если используется StaX или SAX , то подойдёт. Но если там DOM parser (загружающий файл в память для разбора), то для большого файла этот способ не подойдёт. Не знаю, какой именно там. Можно конечно посмотреть исходный код Pentaho ETL или выяснить путём эксперимента. там готовые примеры для Stax парсинга $BASEDIR/samples/transformations правда немного разбираться все равно придется ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2017, 12:30 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2019, 15:50 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
Используй теги, Голиафик Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2019, 15:54 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
goliaf, Что это за портянка?xml against xsd в 2020 валидируется двумя строчками .за такую портянку в наше время нужно бить,причём бить сильно и желательно по рукам) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2019, 23:42 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
/* 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; ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2020, 11:38 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
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; ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2020, 12:00 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
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; ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2020, 12:04 |
|
парсинг XML
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2020, 12:19 |
|
|
start [/forum/topic.php?fid=59&msg=39975309&tid=2120749]: |
0ms |
get settings: |
8ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
55ms |
get topic data: |
2ms |
get forum data: |
1ms |
get page messages: |
451ms |
get tp. blocked users: |
0ms |
others: | 316ms |
total: | 840ms |
0 / 0 |