Реализация xml-парсинга со вставкой в базу данных на Yii 2?
Существует сложная струкура бд (авторы, статьи, названия статей, имена авторов названия статей, журнал, в котором была опубликована статья, год, номер выпуска и серия журнала).
Все это многотабличная база данных, которую нужно пополнять данными из xml-файла. То есть, по сути, надо распарсить сгенерированный сторонним ресурсом (в моем случае сторонний ресурс - это elibrary.ru) xml-файл с данными и синсертить все в упомянутую выше базу данных на наших серверах. Подскажите, коллеги, знатоки, опытные товарищи, как лучше и грамотнее реализовать данную поделку?
То есть алгоритмически это должно быть что-то вроде следующего. Получить xml-файл (руками передать парсеру - пока только так, из-за отсутсвия какого-нибудь API в E-library) и парсер должн спарсить данные об авторах, статьях и, минуя всякие траблы типа повторений, вставить все в нашу локальную базу данных. Так же стоит упомянуть, что в редакции есть не один журнал и каждый автор со статьями может быть опубликован в любои из них, что накладывает кучу проверок на инсерт во избежание дублей.
Если уж совсем абстрагироваться от деталей, то на выходе должна получиться бд в котрой можно узнать какой автор сколько раз в каких журналах публиковался и какие статьи (название, описание, заголовки, теги, ключевые слова, удк и прочие данные). И все это хотелось бы поднять на Yii2. Буду рад любым адекватным наставлениям, ссылкам и проч проч.
Загружаете хмл, как обычный файл на сервер, получаете его содержание, берете нужные данные из хмл с помощью SimpleXML, расталкиваете их куда хотите по какой хотите логике.
Какая разница, какой язык? XML настолько поплуярен, что библиотеки, которые его парсят есть в каждой стандартной библиотеке. И в DOM-парсере не особо важно, на каком он языке, если реализует, как вы сказали XPATH
Виктор Выскребенцев: большая разница, ибо PHP не рассчитан на длительное выполнение операций. Вот здесь habrahabr.ru/post/175813 есть простое сравнение по парсингу 1.5 ГБ базы на нескольких языках, поэтому Python может быть не лучшим решением.
egorsmkv: То есть, пхпшники так и не научились запускать php из консоли и использовать очереди? Прескорбно)
А скорость - это, конечно, очень важно. Но, во-первых, это всего лишь одно из требований, и если оно не указано - в приоритет нужно ставить удобство реализации.
Плюс,в интернете - намного важнее скорость загрузки страницы, а не непосредственно парсинга, потому что задержка сети будет куда значительнее и лучше сконцентрировать усилия на параллелизации.
Да и вообще, если это все нужно, а не сведется, как скорее всего и будет, к какому-нибудь SimpleDOM в 100 строчек.
Виктор Выскребенцев: по-моему, каждую задачу нужно решать наиболее подходящим инструментом. Я имею ввиду скорость выполнения программы и не важно - указано в требованиях или нет.
Если вернуться к задаче, то база, скорее всего, со временем будет только расти, поэтому нужно сразу использовать лучшее решение.
egorsmkv: ну, на часть вопрсоа вы ответили правильно. Но дальше несовсем. Если производительность не главное - то правильный интсрумент выбирается по остальным параметрам.
А сделать сразу "лучше" не получится никак и никогда.
Кстати, скорость парсинга != скорость выполнения программы != производительность. Для начала, хотя бы потому, что, как я сказал, задержка сети - куда значительнее
Виктор Выскребенцев: я не понимаю о какой задержке сети вы говорите, автор вопроса написал, что xml-файл предоставляется сайтом elibrary.ru и дальше нужно его как-то обрабатывать.
Полагаю, я ошибся, когда написал "скорость выполнения программы", потому, что сайт написанный на С будет работать быстрее, чем на PHP, поэтому правильным будет использовать наиболее подходящий инструмент для решения задачи.
Я имел под "лучше" наиболее эффективный инструмент.
Виктор Выскребенцев: программа (сайт) на Си будет работать быстрее, чем реализация на PHP, но это неправильно со стороны выбора инструмента (длительность разработки), ибо его область применения точно не в написании сайтов.
Автор вопроса написал "распарсить сгенерированный сторонним ресурсом". Объясните, что вы имеете в виду, под "задержкой"?
egorsmkv: Да, согласен, немного не в ту сторону подумал - если файл XML будет один, то, конечно, не важно. Если же будут парситься, например, все страницы всех книг всех авторов - тут уже скорость разбора будет не так важна.
Ну, и опять же, исходя из целесообразности инструмента, куда правильнее то, что знаешь (php автор, видимо, знает, раз в теги хотя бы поставил его. И прашивает про Yii). Тем более, в такой простой вещи. как парсинг простой XML.
Виктор Выскребенцев: парсинг xml пусть и является простым делом, но, если посмотреть на его содержание, которое описал автор, то становится ясно, что чем больше файл, тем больше оперативной памяти программа будет использовать. Исходя из этого PHP может оказаться не лучшим решением.
P.S. программист не должен ограничиваться одним языком для решения поставленных задач.