php — Парсер для XML файла с бд

Вопрос задан

Изменён 6 месяцев назад

Просмотрен 36 раз

Всем привет! Буду признателен, если натолкнете меня на мысль, как выполнить это задание. Я новичок в парсинге, поэтому для меня здесь мало что понятно.

На ftp сервер проекта раз в сутки выгружается XML-файл с данными по стоку. С каждой новой выгрузкой данные меняются — одни данные могут обновиться, другие добавиться, третьи удалиться (их не будет в новом XML-файле). Необходимо разработать архитектуру БД на основе XML-выгрузки и написать парсер XML-файла. Парсер должен: добавлять в базу записи, которых в ней еще нет; обновлять записи, которые пришли в XML и уже есть в базе; удалять записи из базы, которых нет в XML (чистить таблицу перед парсингом нельзя).

Парсер должен запускаться через консольную команду. При вызове консольной команды должна быть возможность указать путь до локального файла выгрузки, при этом, если путь до файла не указан, то берется дефолтный файл. При проектировании архитектуры БД необходимо учитывать, что по всем полям, кроме id и generation_id , будет происходить фильтрации данных.

  • php
  • база-данных
  • xmlparser
  1. Берете XML файл, смотрите его названия полей и что в них(строка, цифра, дата), создаете такой же набор полей в БД.
  2. Если там сложный файл и какие то теги имеют потомков, их надо создавать в отдельные таблицы, а у родителя должен быть внешний ключь к ним.
  3. У родительского тега вероятно есть уникальный идентификатор, его в БД называете каким нибудь ExternalId. Если такого нет, его надо придумать из составных частей других данных, важна уникальность.
  4. По полям, которые будут участвовать в where надо создать индексы.
  5. Гуглите что то подобное «php parse xml file».
  6. При вычетке XML файла уже в коде PHP проверяете наличие ExternalId у себя в базе. Аля: select count(*) from someTable where ExternalID = ExternalIdFromFile. Если запрос возвращает больше 0 значит запись есть нам ее записывать не нужно.

Если у вас 0 знаний PHP и такой же 0 sql у вас ничего не получится, эту задачу «методом тыка» не решить.

2

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Компонент Yaml | Symfony

Дата обновления перевода: 2023-01-19

Компонент Yaml загружает и сбрасывает файлы YAML.

Компонент Symfony Yaml анализирует YAML строки, чтобы преобразовать их в PHP массивы. Он также может преобразовывать PHP массивы в YAML строки.

YAML, YAML не является языком разметки — это дружелюбный стандарт сериализации данных для всех языков программирования. YAML является отличным форматом для ваших файлов конфигурации. Файлы YAML так же экспрессивны, как файлы XML, и так же читаемы, как файлы INI.

Компонент Symfony Yaml реализует выбранный поднабор функций, определённых в спецификации версии YAML 1.2.

Tip

Узнайте больше о компоненте Yaml в статье .

Note

Если вы устанавливаете этот компонент вне приложения Symfony, вам нужно подключить файл vendor/autoload.php в вашем коде для включения механизма автозагрузки классов, предоставляемых Composer. Детальнее читайте в этой статье.

Одна из целей Symfony Yaml — найти правильный баланс между скоростью и функциональностью. Он поддерживает только необходимые функции для обработки файлов конфигурации. Не хватает таких заметных функций: директив документов, многострочных цитируемых сообщений, компактных коллекций блоков и многодокументных файлов.

Поддерживает реальный парсер и понимает большую часть спецификации YAML для всех ваших потребностей конфигурации. Это также означает, что парсер достаточно обширен, легок в понимании и достаточно прост для расширения.

Каждый раз, когда у вас есть проблема синтаксиса в ваших YAML файлах, библиотека выводит полезное сообщение с именем файла и номером строки, где возникла проблема. Это очень облегчает отладку.

Он также может сбрасывать PHP массивы в YAML с поддержкой объектов, и встраиваемый уровень конфигурации для красивых выводов.

Поддерживает большинство встроенных типов YAML вроде дат, целых чисел, чисел в восьмеричной системе, булевых значений и многие другие…

Полная поддержка ссылок, дополнительных имён и ключей полного слияния. Не повторяйте самостоятельно, ссылаясь на распространённые части конфигурации.

Компонент Symfony Yaml состоит из двух главных классов: один анализирует YAML строки (Parser), а второй — сбрасывает PHP массив в строку YAML (Dumper).

Поверх этих двух классов, класс Yaml работает как тонкая прослойка и упрощает частые варианты использования.

Метод parse() анализирует строку YAML и преобразует её в PHP массив:

Если ошибка возникает во время анализа, парсер вызывает исключение ParseException, показывая тип ошибки и строчку исходной строки YAML, где возникла ошибка:

Метод parseFile() анализирует содержание YAML в указанном файле и преобразует его в PHP значение:

Если во время анализа возникает ошибка, парсер вызывает исключение ParseException.

Метод dump() преобразует любой PHP массив в его представление YAML:

Если ошибка возникает во время сброса, парсер вызывает исключение DumpException.

Формат YAML поддерживает два типа представления для массивов, расширенное и вставленное. По умолчанию, дампер использует расширенное представление:

Второй аргумент метода dump() настраивает уровень, на котором вывод переключается с расширенного представления на вставленное:

По умолчанию, компонент YAML использует 4 пробела для отступа. Это может поменять с помощью третьего аргумента таким образом:

Длинные числовые литералы, будь они целыми числами, float или шестнадцатиричными, известны своей плохой читаемостью в коде и файлах конфигурации. Поэтому файлы YAML позволяют добавлять нижние подчёркивания для улучшения их читаемости:

Во время анализа содержания YAML, все символы _

удаляются из содержания числовых литералов, поэтому лимита количества нижних подчёркиваний, которые вы можете включать или то, как вы группируете содержание, не существует.

Вы можете сбрасывать объекты, используя флаг DUMP_OBJECT:

И анализировать их, используя флаг PARSE_OBJECT:

Компонент YAML использует метод PHP serialize() для генерирования представления строки объекта.

Caution

Сериализация объекта специфична для этой реализации, другие парсеры PHP YAML скорее всего не узнают тег

php/object, а не-PHP реализации точно не узнают — используйте с осторожностью!

Вы можете сбрасывать объекты, как Yaml-карты, используя флаг DUMP_OBJECT_AS_MAP:

И анализировать их, используя флаг PARSE_OBJECT_FOR_MAP:

Компонент YAML использует приведение PHP (array), чтобы сгенерировать строчное представление объекта в виде карты.

По умолчанию, парсер закодирует невалидные типы, как null. Вы можете заставить парсер вызывать исключения, используя флаг PARSE_EXCEPTION_ON_INVALID_TYPE:

Схожим образом вы можете использовать

DUMP_EXCEPTION_ON_INVALID_TYPE при дампе:

По умолчанию, парсер YAML преобразует строки без кавычек, которые будут выглядеть как дата или дата-время во временную метку Unix; например, 2016-05-27 или 2016-05-27T02:59:43. 1Z (ISO-8601):

Вы можете заставить его преобразовывать в экземпляр DateTime, используя флаг PARSE_DATETIME:

В YAML многострочные строки могут быть представлены, как блоки литералов. По умолчанию, дампер закодирует много строк в виде инлайновой строки:

Вы можете заставить его использовать блок литералов с помощью флага DUMP_MULTI_LINE_LITERAL_BLOCK:

По умолчанию, YAML-парсер относится к PHP константам, включенным в содержание, как в обычным строкам. Используйте флаг PARSE_CONSTANT и специальный синтаксис !php/const, чтобы проанализировать их, как соответствующие PHP константы:

Парсер YAML поддерживает PHP-исчисления, как модульные, так и бэк-энда. По умолчанию, они анализируются как обычные строки. Используйте флаг PARSE_CONSTANT и специальный синтаксис !php/enum, чтобы анализировать их как реальные PHP-исчисления:

6. 2

Поддержка PHP-исчислений была представлена в Symfony 6.2.

Вы можете сбросить бинарные данные, используя флаг DUMP_BASE64_BINARY_DATA:

Бинарные данные автоматичеки анализируются, если они включают в себя флаг YAML !!binary (нет необходимости передавать какой-либо флаг парсеру Yaml):

Кроме встроенной поддержки тегов вроде !php/const и !!binary, вы можете определить ваши собственные YAML теги и анализировать их с помощью флага PARSE_CUSTOM_TAGS:

Если содержание для сброса содержит объекты TaggedValue, то они автоматически преобразуются в YAML теги:

Официальная спецификация YAML использует и null, и ~ для представления значения null. Этот компонент использует по умолчанию null при сбросе значений null, но вы можете сбрасывать их как ~ с флагом DUMP_NULL_AS_TILDE:

Синтаксис содержания YAML может быть валидирован через CLI, используя команду LintCommand.

Для начала, установите компонент Console:

Создайте консольное приложение с lint:yaml в качестве его единственной команды:

Далее, выполните скрипт для валидации содержания:

Результат записывается в STDOUT и использует формат простого текста по умолчанию. Добавьте опцию --format, чтобы получить вывод в формате JSON:

Tip

Команда проверки соблюдения стандартов кода также сообщит обо всех устареваниях в провеяемых YAML файлах. Это может быть, к примеру, быть полезным для определения устареваний содержания YAML файлов во время автоматизированных тестов.

ошибок · nikic/PHP-Parser · GitHub

Новый выпуск

Есть вопрос по этому проекту? Зарегистрируйте бесплатную учетную запись GitHub, чтобы открыть задачу и связаться с ее сопровождающими и сообществом.

Зарегистрируйтесь на GitHub

Нажимая «Зарегистрироваться на GitHub», вы соглашаетесь с нашими условиями обслуживания и Заявление о конфиденциальности. Время от времени мы будем отправлять вам электронные письма, связанные с учетной записью.

Уже на GitHub? Войти на ваш счет

Как сделать так, чтобы каждый элемент массива отображался на отдельной строке?

#922 открыт 19 апр. 2023 г. автором YepYuYu

Планируемые изменения в NodeTraverser

#916 открыт

5 марта 2023 г. автором Никик

5,0 expr производительность печати

#908 открыт 22 декабря 2022 г. автором стаабм

doc/component/Pretty_printing.markdown : shortArraySyntax не устаревший вариант

#890 открыт 10 сентября 2022 г. автором WinterSilence

Рефакторинг PrettyPrinterAbstract

#868 открыт 7 августа 2022 г. автором WinterSilence

Печать анонимных классов удаляет новые строки между методами

#803 открыт 27 августа 2021 г. автором Bakekretzmar

Встроенный комментарий перед точкой с запятой не в AST

#802 открыт 10 августа 2021 г. автором pableu

Встроенный комментарий относится к следующей строке

#791 открыт 24 июня 2021 г. автором Glowdan

Затенение полей родительского экземпляра в производных автоматически сгенерированных классах парсера

#772 открыт 25 апр. 2021 г. автором квазилите

Парсер не видит docComments между атрибутами и объявлением класса

#762 открыт 1 марта 2021 г. автором Ондреймиртес

Расширить узел, чтобы иметь недопустимый код PHP

#756 открыт 4 февраля 2021 г. автором shaumux

Упростить отступ

#723 открыто 19 октября 2020 г. автором flip111

Добавление элемента в Expr_Array

#678 открыт 5 июля 2020 г. автором vaclavgreif

Аннотировать имена символьным типом?

#648 открыт 26 янв. 2020 г. автором nikic

Добавить узлы ошибок для дополнительных отсутствующих параметров?

#616 открыт 25 июня 2019 г. автором muglug

[Важно] Спасибо!

#610 открыт 12 мая 2019 г. автором mickaelandrieu

Запрос: различать строки heredoc в кавычках и в кавычках

#592 открыт 26 марта 2019 г. автором JakeTunaley

Новый узел оператора для дополнительного блока упаковки?

#590 открыт 14 марта 2019 г. автором ondrejmirtes

Запрос: дамп, создающий php для создания AST

#566 открыт 4 января 2019 г. автором flip111

array_pair не должен содержать пустой

#561 открыт 25 декабря 2018 г. автором zhujinxuan

Шестнадцатеричные символы больше, чем \x7f автоматически прерывает синтаксический анализ

#550 открыт 24 ноября 2018 г. автором nicolasrod

Где я могу получить справочную таблицу типа узла?

#501 открыт 14 мая 2018 г. автором Sewens

Интерфейс для вещей с публичной/защищенной/приватной видимостью

#457 открыт 31 декабря 2017 г. автором legoktm

@file docblock связан как комментарий к следующему оператору PHP

#445 открыт 16 ноября 2017 г. автором joachim-n

Потерянный комментарий к последнему элементу массива

#384 открыт 2 мая 2017 г. автором j-d

ProTip! Обновлено за последние три дня: обновлено:>2023-05-19.

Как разобрать файл YAML в PHP?

«Синтаксический анализ», используемый в терминологии компьютерного программирования, означает проверку текстовых данных (например, найденных в документах HTML или PHP) слово за словом и строку за строкой, чтобы определить, что необходимо сделать. об этом. Язык PHP позволяет выполнять в нем парсинг файлов YAML. Как вы знаете, YAML — это технология сериализации, используемая для настройки. Итак, он придумал другую функцию для анализа данных YAML в PHP. В этой статье мы будем рассматривать иллюстрации, чтобы подробнее рассказать об использовании всех этих функций при синтаксическом анализе YAML».

Давайте начнем с основ. Нам нужно установить сервер Apache в нашей системе Ubuntu 20.04 Linux, используя инструкцию по установке «apt-get». Для продолжения установки может потребоваться пароль вашей учетной записи пользователя. Добавьте свой пароль и продолжайте.

В процессе установки вы получите подтверждающий вопрос от системы о том, сколько места она займет. Вам нужно нажать клавишу «Y», чтобы продолжить, как показано ниже.

Чтобы использовать файлы PHP в оболочке терминала, вам также необходимо установить утилиту командной строки PHP. Его довольно легко установить на терминал системы Ubuntu 20.04 Linux, используя инструкцию установки «php-cli», как показано. Он будет смонтирован за несколько секунд без каких-либо задержек.

Следующим, что нужно установить в Ubuntu 20.04, является пакет php-yaml, необходимый для преобразования файла yaml в файл PHP. Для этого мы снова использовали инструкцию по установке apt-get, за которой следует пароль учетной записи пользователя. Он будет установлен быстро.

После всех установок мы перезапустили службу apache с помощью инструкции systemctl и также включили ее. Состояние службы apache показывает, что она активно работает.

Давайте продолжим с некоторыми иллюстрациями, чтобы подробнее рассказать об использовании YAML в PHP. Итак, мы создали новый файл PHP в текущем рабочем каталоге, используя запрос «touch», показанный на изображении ниже, то есть test.php.

Пример 01

В нашем первом примере мы будем использовать функцию yaml_emit() для преобразования элемента другого типа в формат yaml. Для этого мы начинаем наш PHP-код в редакторе «nano» с PHP-тегом «

После этого мы вызывали здесь функцию «yaml_emit()», чтобы использовать в ней переменную Data, т. е. анализировать данные этого типа массива в формате файла yaml и сохранять результат в другой переменной «res». Затем мы использовали оператор «echo» PHP для отображения данных переменной «res» в оболочке вместе с тегами «pre». Код «php» для преобразования в YAML завершен и готов для нашего использования. Давайте сохраним его с помощью Ctrl+S и выйдем из него с помощью Ctrl+X.

Теперь мы выполнили файл «test.php» с инструкцией «php» и получили данные массива, отображаемые в формате файла YAML на нашем экране терминала Ubuntu, показанном ниже.

Пример 02

В нашем первом примере мы рассмотрели использование функции yaml_emit() для преобразования некоторой другой формы переменных данных в формат YAML. В этой статье мы рассмотрим функцию «yaml-parse», которая анализирует строку как поток yaml в переменной php и отображает ее в формате YAML. Итак, мы начали этот PHP-код с использованием открывающего тега «

Поток YAML был закрыт с помощью «YML;». Мы использовали оператор «echo», чтобы распечатать начало данных потока YAML как «

». Функция print_r() предназначена для использования функции yaml_parse(), принимающей поток переменных «Данные» в качестве входного аргумента. PHP-код готов к выполнению.

После выполнения этого файла кода мы получили формат YAML проанализированного потока YAML в переменную «Данные» на экране оболочки, используя здесь функцию yaml_parse().

Пример 03

Давайте посмотрим на наш последний пример синтаксического анализа файла YAML в php-код и отображения данных формата YAML в оболочке. Для этого вам необходимо создать файл YAML в текущем рабочем каталоге системы Ubuntu 20.04 Linux. Итак, мы попробовали сенсорную инструкцию создать файл «test.yml» в текущей папке, открыли его с помощью редактора nano и добавили в него данные формата YAML. Вы можете видеть, что он содержит два основных ключа, каждый из которых содержит 3 значения пары ключей.

После сохранения файла YAML мы открыли файл php и добавили в него приведенный ниже код php. Здесь использовалась функция yaml_parse_file() с указанием пути к только что созданному файлу YAML, т. е. «test.yml». Проанализированные данные будут сохранены в переменной «var». Функция print_r() использовалась здесь для отображения данных файла разбора переменной YAML. Этот код был завершен здесь, и мы сохранили его для выполнения.

После запуска файла кода «php» с помощью инструкции php мы получили данные файла YAML, отображаемые на нашем экране. Вот как можно использовать функцию yaml_parse_file() для анализа файла YAML в php-код и отображения его в оболочке.