#php #mysql #xml #parsing
#php #mysql #xml #Синтаксический анализ
Вопрос:
Алоха всем,
Заранее приношу извинения за множество вопросов, но меня попросили разработать базу данных, и у меня нет опыта работы с PHP и MySQL. Я подумал, что для меня было бы хорошим упражнением попытаться немного узнать о них и одновременно попытаться разработать концептуальную базу данных для моей работы. По сути, это база данных, которая использует SYDI для получения информации WMI с наших компьютеров под управлением Windows для использования при управлении исправлениями. Я представляю себе эту работу следующим образом:
- Запускается SYDI и генерируется XML-файл с информацией.
- Используя PHP-интерфейс для нашей базы данных исправлений, XML-отчет анализируется, и затем желаемая информация вставляется в базу данных MySQL.
- Отчеты генерируются из базы данных для сравнения с последней известной базовой линией для действия. Если обнаруживается, что компьютеры работают ниже базового уровня, сервер исправлений используется для доставки необходимых исправлений на компьютеры-нарушители.
В 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, чтобы перенести их в базу данных, но, по крайней мере, я намного ближе к решению.