Я новичок в XML и php, и это может звучать как очень простой вопрос. У меня есть этот XML-файл, который похож.
<testsuites> <testsuite name="test1" errors="0" skipped="0" tests="19" failures="0" time="2093"> <properties> <property name="script" value="smoketest" /> <property name="script_start_time" value="14042" /> <property name="dut_type" value="SSR10" /> <property name="block" value="20PGIGE" /> <property name="dut_image" value="IPOS-15.1.27.100.98-Release" /> </properties> <testcase classname="SSR/smoketest" name="TC200: Verify PPA3LP " time="4"> </testcase>
Мне нужно ввести все значения в таблице mysql. Создал базу данных со всеми полями. Проблема заключается в структуре вложенности внутри свойств и тестовой таблицы. Мне тоже нужны все эти ценности. может ли кто-нибудь привести меня к учебнику, в котором объясняется, как это сделать, используя php. Благодарю.
Поскольку XML содержит иерархические данные (элементы с атрибутом и дочерними элементами снова с атрибутами), но ваша таблица базы данных является плоской структурой (строка с столбцами), вам необходимо преобразовать данные.
Данные в дереве документов XML:
\- testsuite | |- name="test1" | \- properties | |- property | | \- name="script" value="smoketest" ... ...
Данные в таблице Testsuites:
Testsuites +-------+-----------+- ... | name | script | ... +-------+-----------+- ... | test1 | smoketest | ... +-------+-----------+- ...
воTestsuites +-------+-----------+- ... | name | script | ... +-------+-----------+- ... | test1 | smoketest | ... +-------+-----------+- ...
Несмотря на то, что способ структурирования структуры отличается, оба представляют собой список полей, поэтому даже XML организован иерархически, представленные здесь данные могут быть представлены в виде списка. Это предварительное условие для его трансформации.
Поскольку оба являются своего рода списком, вы можете справиться с ним в цикле. Вы решаете преобразование путем итерации элементов в XML-документе, а именно: вы перебираете тесты, если один из таких элементов представляет все данные одной строки.
Затем вы получаете данные каждого из таких элементов testuite и сохраняете их в плоской структуре, подобной массиву. Затем вы используете этот массив для вставки строки.
Это сопоставление наиболее легко выполняется с помощью XML, используя XPath в сочетании с контекстным узлом. Контекст-узел здесь – это элемент testsuite, который у вас есть на каждой итерации.
... 'name' => 'string(./@name)', ... 'script' => 'string(./properties/property[@name="script"]/@value)', ...
Такое сопоставление позволяет вам легко настраивать гибкий способ получения всех необходимых данных с каждой итерации. Этот принцип был описан ранее в разделе Как извлечь структурированный текст из HTML-списка в PHP? , Вот более упрощенный пример с вашим блоком XML:
$buffer = <<<XML <testsuites> <testsuite name="test1" errors="0" skipped="0" tests="19" failures="0" time="2093"> <!-- ... all the data you've got ... --> </testsuite> </testsuites> XML; $mapping = [ 'name' => 'string(./@name)', 'script' => 'string(./properties/property[@name="script"]/@value)', ]; $doc = new DOMDocument(); $doc->loadXML($buffer); $xpath = new DOMXPath($doc); $testSuites = $xpath->evaluate('/*/testsuite'); foreach ($testSuites as $testSuite) { $row = []; foreach ($mapping as $name => $expression) { $row[$name] = $xpath->evaluate($expression, $testSuite); } print_r($row); }
во$buffer = <<<XML <testsuites> <testsuite name="test1" errors="0" skipped="0" tests="19" failures="0" time="2093"> <!-- ... all the data you've got ... --> </testsuite> </testsuites> XML; $mapping = [ 'name' => 'string(./@name)', 'script' => 'string(./properties/property[@name="script"]/@value)', ]; $doc = new DOMDocument(); $doc->loadXML($buffer); $xpath = new DOMXPath($doc); $testSuites = $xpath->evaluate('/*/testsuite'); foreach ($testSuites as $testSuite) { $row = []; foreach ($mapping as $name => $expression) { $row[$name] = $xpath->evaluate($expression, $testSuite); } print_r($row); }
во$buffer = <<<XML <testsuites> <testsuite name="test1" errors="0" skipped="0" tests="19" failures="0" time="2093"> <!-- ... all the data you've got ... --> </testsuite> </testsuites> XML; $mapping = [ 'name' => 'string(./@name)', 'script' => 'string(./properties/property[@name="script"]/@value)', ]; $doc = new DOMDocument(); $doc->loadXML($buffer); $xpath = new DOMXPath($doc); $testSuites = $xpath->evaluate('/*/testsuite'); foreach ($testSuites as $testSuite) { $row = []; foreach ($mapping as $name => $expression) { $row[$name] = $xpath->evaluate($expression, $testSuite); } print_r($row); }
Это выводит примерные данные из вашего вопроса:
Array ( [name] => test1 [script] => smoketest )
Отображение показывает, как вы можете получить доступ к значениям атрибутов, а также значениям атрибутов на основе другого значения атрибута конкретного элемента. Таким образом, эти два сопоставления охватывают все ваши дела. В общем, это просто xpath, и если вы ищете конкретное «как сделать то или это в xpath» на сайте, вы также можете найти более сложные вещи, например, обращаться с пространствами имен XML, которые не рассматриваются в моем примере.
Наверное, вы знаете, как вставлять данные в базу данных, так как теперь с массивом (или даже лучше, возможно, с отображением), это должно быть легко, поскольку вы превратили древовидную структуру в плоскую структуру.