Мне нужна помощь с php-синтаксическим анализом xml для вставки в базу данных mysql

#php #mysql #xml #parsing

#php #mysql #xml #Синтаксический анализ

Вопрос:

Алоха всем,

Заранее приношу извинения за множество вопросов, но меня попросили разработать базу данных, и у меня нет опыта работы с PHP и MySQL. Я подумал, что для меня было бы хорошим упражнением попытаться немного узнать о них и одновременно попытаться разработать концептуальную базу данных для моей работы. По сути, это база данных, которая использует SYDI для получения информации WMI с наших компьютеров под управлением Windows для использования при управлении исправлениями. Я представляю себе эту работу следующим образом:

  1. Запускается SYDI и генерируется XML-файл с информацией.
  2. Используя PHP-интерфейс для нашей базы данных исправлений, XML-отчет анализируется, и затем желаемая информация вставляется в базу данных MySQL.
  3. Отчеты генерируются из базы данных для сравнения с последней известной базовой линией для действия. Если обнаруживается, что компьютеры работают ниже базового уровня, сервер исправлений используется для доставки необходимых исправлений на компьютеры-нарушители.

В XML-отчете от SYDI используется пара форматов: один с атрибутами в одном теге, а другой, где один родительский тег содержит несколько дочерних тегов с атрибутами. Я выяснил, как разобрать первый. Вот образец данных и кода для этого (это действительно довольно простой материал) с результирующим выводом:

 <machineinfo manufacturer="Dell Inc." productname="Precision M90" identifyingnumber="87ZGFD1" chassis="Portable" /> 

$xml = simplexml_load_file("sydiTest.xml");

foreach($xml->machineinfo[0]->attributes() as $a => $b)
    {
        echo $b, "</br>";
    }

Dell Inc.
Precision M90
87ZGFD1
Portable
  

Мне не нужно было имя атрибута, только значение, поэтому я только повторил $ b там. Во-вторых, вот пример самих данных, а также кода и выходных данных для синтаксического анализа:

  <patches>
  <patch description="Microsoft .NET Framework 1.1 Security Update (KB2416447)" hotfixid="M2416447" installdate="04-Feb-11" />
  <patch description="Microsoft .NET Framework 1.1 Service Pack 1 (KB867460)" hotfixid="S867460" installdate="04-Feb-11" />
  <patch description="Windows Management Framework Core" hotfixid="KB968930" installdate="2/4/2011" />
  <patch description="Security update for MSXML4 SP2 (KB954430)" hotfixid="Q954430" installdate="04-Feb-11" />
  <patch description="Security update for MSXML4 SP2 (KB973688)" hotfixid="Q973688" installdate="04-Feb-11" />
  <patch description="Microsoft Internationalized Domain Names Mitigation APIs" hotfixid="IDNMitigationAPIs" installdate="6/30/2008" />
 </patches>

foreach ($xml->patches->patch[0]->attributes() as $a => $b) 
    {
        echo $b, "</br>";
    }

Microsoft .NET Framework 1.1 Security Update (KB2416447)
M2416447
04-Feb-11
  

Как вы можете видеть, я получил только первый патч, остальные отсутствуют. Я полагаю, что ‘patch[0]’, скорее всего, является проблемой, поскольку он ссылается только на первый дочерний тег. Как я могу заставить его ссылаться на остальные дочерние элементы?

Результаты поднимают другую проблему. Есть ли какой-либо способ выбрать определенные атрибуты и игнорировать остальные? Например, при первом анализе machineinfo parse получает всю необходимую мне информацию. Во втором разборе мне нужно только описание и hotfixid. Как только я получу правильный синтаксис для синтаксического анализа, предполагая, что он выполняется как первый, я, скорее всего, получу все атрибуты. Мне не нужна дата установки.

Наконец, как я могу присвоить извлеченные значения переменным? В результате первого анализа получаются нужные мне данные, но не в правильном порядке. Моя структура таблицы выглядит следующим образом:

 CREATE TABLE InventoryItems
    (InvSerNum          VARCHAR(20) NOT NULL,
    Make                VARCHAR(20),
    Model               VARCHAR(20),
    Platform            VARCHAR(12),
CONSTRAINT Inventory_PK PRIMARY KEY (InvSerNum));
  

Сначала мне нужен идентификационный номер (InvSerNum). Конечно, я всегда мог бы изменить порядок полей в таблице в соответствии с XML, но я бы предпочел оставить все как есть. Я думаю, что я могу использовать инструкцию INSERT и просто использовать переменные для ввода значений.

Я пытаюсь сделать все это самостоятельно, но застрял на части синтаксического анализа XML. Если кто-нибудь может помочь мне в понимании процесса, я был бы у вас в долгу.

Ответ №1:

Попробуйте использовать RapidXML в PHP. Немного упрощает синтаксический анализ XML. Это все еще не настолько интуитивно понятно: вам понадобится хороший отладчик, чтобы разобраться в этом. Остальные ваши вопросы требуют от вас небольшого исследования привязок mysql_(function_name) в PHP. Об этом есть куча статей.

Ответ №2:

Я разобрался со вторым вопросом синтаксического анализа. Я использовал следующий код:

 foreach ($xml->patches->patch as $patch1) {
    foreach ($patch1->attributes() as $a => $b) {
        echo $b, "<br />";
    }
}
  

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