Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/41: Рейтинг темы: голосов - 41, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 18

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

27.11.2015, 12:10. Показов 8940. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.11.2015, 12:10
Ответы с готовыми решениями:

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

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

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

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

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

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

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
Цитата Сообщение от reisal78 Посмотреть сообщение
я бы сказал очень мало, скорее всего придется как то распаралеливать парсинг
там файлик то почти на 3 млн строк
Ой, и правда, не заметил приписку автора.

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

Code
1
2
3
4
<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" />
На выводе было
Code
1
2
<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
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
28.11.2015, 01:06
lemegeton, если это то что подразумевается, тогда надо будет делать два прохода. Первый, описанный выше с сохранением всех удаленных orderId, второй проход по файлу из шага один и удалением нужных записей. Думаю тогда программа будет пробегать за 4сек примерно. Зависит от кол-ва записей подлежащих удалению.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
28.11.2015, 17:53
Зависит от устройства ввода-вывода, конечно. Возможно, решения в два прохода будет достаточно.
0
8 / 8 / 4
Регистрация: 29.01.2015
Сообщений: 57
28.11.2015, 23:58
Не увидел какие именно инструменты использовать. Буду делать средствами java.util.regex.*
посмотри этот пример, мб поможет

https://github.com/uzen/slimap... arser.java
0
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 18
30.11.2015, 20:47  [ТС]
Спасибо за комментарии.
0
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 18
03.12.2015, 14:21  [ТС]
Блин не могу разобраться с регулярными выражениями. Помогите пожалуйста как его правильно написать.
Нужно вытащить из строки все значения что в кавычках только и всего.
<AddOrder book="book-1" operation="SELL" price="100.50" volume="81" orderId="1" />
0
529 / 432 / 159
Регистрация: 25.11.2014
Сообщений: 1,662
03.12.2015, 14:42
Регулярка здесь только замедлит процесс (хотя не знаю, достаточно ли, чтобы не уложиться в 6 секунд). Циклом по строке и ручками тащи.
0
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 18
03.12.2015, 14:54  [ТС]
Ок спасибо
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
03.12.2015, 14:54
а можно весь файл выложить? типо так для теста кое что проверить
0
03.12.2015, 14:57

Не по теме:

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

0
0 / 0 / 0
Регистрация: 27.11.2015
Сообщений: 18
03.12.2015, 16:17  [ТС]
https://drive.google.com/file/... kzUDBiVEk/

Добавлено через 1 час 9 минут
Ребят а что если split использовать?
razbor = s.split(""");
он как раз помещает в массив чистые значения?
Мне только нужно их по индексу вытягивать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.12.2015, 16:17
Помогаю со студенческими работами здесь

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

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

XML парсер
Здраствуйте. Нужно создать парсер XML такой структуры: &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;!-- edited with XML Spy v4.4 U...

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

Парсер xml
Добрый день! Мой научный руководитель дал мне курсовую, тема - создание БД на основе xml. Полчаса гугления показали, что для этого нужно...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru