Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
Алексей Марков
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 17
1

Написать парсер XML самому

27.11.2015, 12:10. Просмотров 4101. Ответов 50

Доброго времени!
Как и всем делающим попытки устроится на позицию начинающего разработчика java, работодатели дают задания, которые необходимо выполнить. И меня эта учесть недавно настигла чему я и рад.
Прошу помочь в решении задачи.
Суть задания, есть XML файл:
XML
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<Orders>
<AddOrder book="book-1" operation="SELL" price="100.50" volume="81" orderId="1" />
<AddOrder book="book-3" operation="BUY" price=" 99.50" volume="86" orderId="2" />
<AddOrder book="book-1" operation="BUY" price=" 99.70" volume="16" orderId="3" />
<DeleteOrder book="book-1" orderId="1" />
.... 2 776 399 строк
</Orders>
Где описаны три операции:
1. заказ Sell
2. заказ Buy
3. удалить order

Суть сделать парсинг за 6 секунд и выдать итог в другой файл уже без удаленных orders.

Как мне объяснили нужно самому парсить что бы успеть за 6 секунд никакие инструменты SAX, DOM и пр.. не дадут этого результата.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2015, 12:10
Ответы с готовыми решениями:

Запись XML-дерева сразу в xml-файл (парсер JAXP)
Народ!Программеры!Помогите человеку,плиз! Парсерю я xml-файл,через DOM-модель,использую JAXP.После...

Dom парсер и xml-схема
Здравстуйте, объясните если докумен валидации xsd или dtd находиться на удаленном хосте в записи...

Парсер для строк в XML-файле
Есть обычный xml файл, в котором хранятся 30 обычных строк, в тегах. Посоветуйте парсер, чтоб я мог...

Работа с файлами xml на Android. DOM парсер
Сейчас пишу приложение для Android и мне необходимо выполнить чтение данных из xml. Сначала я...

Написать свой парсер сайта
Ребята, есть задача, спарсить информацию с одного сайта. С какого - не могу сказать. Проблема в...

50
reisal78
936 / 681 / 227
Регистрация: 28.04.2013
Сообщений: 1,921
27.11.2015, 12:33 2
Алексей Марков, вы хотите что бы это задание сделали за вас?
0
Алексей Марков
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 17
27.11.2015, 12:51  [ТС] 3
Подсказать как это правильно сделать какими инструментами, классами, методами. Собственно что может помочь. И вас не затруднить это написать )
0
Nimo
34 / 25 / 15
Регистрация: 06.12.2012
Сообщений: 144
27.11.2015, 13:18 4
Вариантов море. Начиная от написания парсера чисто под документ, зная его структуру. Тогда можно:
1. тупо под строки разбить - сделать своего рода свое дерево и манипулировать им.
2. работать сразу с доком как с большой строкой.
3. Не слушать никого и взять нормальное готовое решение, потому что 6 секунд для вашего примера - это очень много. Так или иначе все будет упираться скорее в размер файла.
0
27.11.2015, 13:18
reisal78
936 / 681 / 227
Регистрация: 28.04.2013
Сообщений: 1,921
27.11.2015, 13:31 5
Алексей Марков, тут вот какое дело...
Распарсить xml файл довольно простая задача. С ней справится даже новичек. Если у вас уже это вызывает сложности, то уровень вашей подготовки врятли устроит работодателя.
А вот ограничения по времени задача уже интересная.

Я вам советую распарсить файл самостоятельно так как получится, оценить время работы. Если не будете укладываться - выкладывайте свои наработки попробуем помочь с советом )

Цитата Сообщение от Nimo Посмотреть сообщение
потому что 6 секунд для вашего примера - это очень много.
я бы сказал очень мало, скорее всего придется как то распаралеливать парсинг
там файлик то почти на 3 млн строк
0
Алексей Марков
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 17
27.11.2015, 14:22  [ТС] 6
Не увидел какие именно инструменты использовать. Буду делать средствами java.util.regex.*
Думаю делать так:
1. Нахожу все строки удаления Orders (<DeleteOrder book="book-1" orderId="1" />)
2. Удаляю строки согласно указанных параметров и строки удаления которые отработаны
3. Вывожу итог что осталось.
0
KEKCoGEN
Эксперт Java
2280 / 2121 / 543
Регистрация: 28.12.2010
Сообщений: 8,348
27.11.2015, 16:49 7
Алексей Марков, непонятно как вы собираетесь работать в той конторе если неможете написать элементарный код, который к тому же есть уже готовый в интернете

1. Открыть файл для чтения ф1
2. Открыть новый файл для записи ф1
3. Для каждой строки из ф1 сделать:
----3.1 Если строка не начинается с "<DeleteOrder", записать её в ф2
4. Закрыть дескриптор ф1
5. Закрыть дескриптор ф2

У меня на 2.6кк строк файла программа работала 1.3 сек
0
Nimo
34 / 25 / 15
Регистрация: 06.12.2012
Сообщений: 144
27.11.2015, 20:02 8
Цитата Сообщение от reisal78 Посмотреть сообщение
я бы сказал очень мало, скорее всего придется как то распаралеливать парсинг
там файлик то почти на 3 млн строк
Ой, и правда, не заметил приписку автора.

Цитата Сообщение от Алексей Марков Посмотреть сообщение
Буду делать средствами java.util.regex.*
А вот это плохая идея. Регулярки будут медленнее чем готовые решения.
Да и вообще, так как элемент - одна строка - прочитать это все дело в stream и потом в parallelStream произвести все действия. Правда лукапить по строке еще только так придется.
0
KEKCoGEN
Эксперт Java
2280 / 2121 / 543
Регистрация: 28.12.2010
Сообщений: 8,348
27.11.2015, 20:19 9
ненадо ничего параллелить. Один тред все замечательно делает
0
lemegeton
3013 / 1428 / 483
Регистрация: 29.11.2010
Сообщений: 2,842
28.11.2015, 00:08 10
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
1. Открыть файл для чтения ф1
2. Открыть новый файл для записи ф1
3. Для каждой строки из ф1 сделать:
----3.1 Если строка не начинается с "<DeleteOrder", записать её в ф2
4. Закрыть дескриптор ф1
5. Закрыть дескриптор ф2
Похоже, что автору нужно, чтобы при вводе

Код
<AddOrder book="book-1" operation="SELL" price="100.50" volume="81" orderId="1" />
<AddOrder book="book-3" operation="BUY" price=" 99.50" volume="86" orderId="2" />
<AddOrder book="book-1" operation="BUY" price=" 99.70" volume="16" orderId="3" />
<DeleteOrder book="book-1" orderId="1" />
На выводе было
Код
<AddOrder book="book-3" operation="BUY" price=" 99.50" volume="86" orderId="2" />
<AddOrder book="book-1" operation="BUY" price=" 99.70" volume="16" orderId="3" />
То есть, похоже, что это некоторые инструкции, добавляющие и удаляющие записи.
Не вижу другого выхода, кроме как парсить их и держать в памяти в ассоциативном массиве.
0
KEKCoGEN
Эксперт Java
2280 / 2121 / 543
Регистрация: 28.12.2010
Сообщений: 8,348
28.11.2015, 01:06 11
lemegeton, если это то что подразумевается, тогда надо будет делать два прохода. Первый, описанный выше с сохранением всех удаленных orderId, второй проход по файлу из шага один и удалением нужных записей. Думаю тогда программа будет пробегать за 4сек примерно. Зависит от кол-ва записей подлежащих удалению.
0
lemegeton
3013 / 1428 / 483
Регистрация: 29.11.2010
Сообщений: 2,842
28.11.2015, 17:53 12
Зависит от устройства ввода-вывода, конечно. Возможно, решения в два прохода будет достаточно.
0
pdmitriya
8 / 8 / 4
Регистрация: 29.01.2015
Сообщений: 57
28.11.2015, 23:58 13
Не увидел какие именно инструменты использовать. Буду делать средствами java.util.regex.*
посмотри этот пример, мб поможет

https://github.com/uzen/slimapk/blob...XmlParser.java
0
Алексей Марков
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 17
30.11.2015, 20:47  [ТС] 14
Спасибо за комментарии.
0
Алексей Марков
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 17
03.12.2015, 14:21  [ТС] 15
Блин не могу разобраться с регулярными выражениями. Помогите пожалуйста как его правильно написать.
Нужно вытащить из строки все значения что в кавычках только и всего.
<AddOrder book="book-1" operation="SELL" price="100.50" volume="81" orderId="1" />
0
Velesthau
524 / 427 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
03.12.2015, 14:42 16
Регулярка здесь только замедлит процесс (хотя не знаю, достаточно ли, чтобы не уложиться в 6 секунд). Циклом по строке и ручками тащи.
0
Алексей Марков
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 17
03.12.2015, 14:54  [ТС] 17
Ок спасибо
0
агерон
431 / 289 / 59
Регистрация: 12.10.2009
Сообщений: 1,138
03.12.2015, 14:54 18
а можно весь файл выложить? типо так для теста кое что проверить
0
Velesthau
03.12.2015, 14:57
  #19

Не по теме:

Цитата Сообщение от агерон Посмотреть сообщение
а можно весь файл выложить?
Его можно самому сгенерировать: рандомные имена книг, цены, айди по порядку, рандомное кол-во правил для удаления с рандомными айди из использованных.

0
Алексей Марков
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 17
03.12.2015, 16:17  [ТС] 20
https://drive.google.com/file/d/0B_6HobtZgdmZRVY4a1kzUDBiVEk/

Добавлено через 1 час 9 минут
Ребят а что если split использовать?
razbor = s.split(""");
он как раз помещает в массив чистые значения?
Мне только нужно их по индексу вытягивать?
0
03.12.2015, 16:17
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2015, 16:17

кто подскажет где взять или как написать парсер Xml на Lotusscripte
кто подскажет где взять или как написать парсер XML на lotusScripte или VB нужно распазнать...

Парсер XML
Привет. Почему-то не работает парсер, если использовать переменные. Не работает: $qid= $_GET;...

XML парсер
Здравствуйте. Хочу перейти на линукс. Понадобился для работы xml парсер, и я нашёл тот, который...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.