Преобразование XML в многомерный массив

У меня есть xml-файл следующим образом:

<?xml version="1.0"?>
<table>
<form>
    <input name="id">1</input>
    <input name="name">Steven Law</input>
    <input name="position">Sales Manager</input>
</form>
<form>
    <input name="id">2</input>
    <input name="name">Martin Wow</input>
    <input name="position">Production</input>
</form>
<form>
    <input name="id">3</input>
    <input name="name">Mike Pan</input>
    <input name="position">Office boy</input>
</form>
</table>

Я пытался получить значение элемента. Я не знаю, как получить значение элемента для каждого поля. Пока я пытаюсь так, это просто получить значение атрибута:

<?php
$dom = new DOMDocument();
$dom->load("data.xml");

$input = $dom->getElementsByTagName('input');
foreach($input as $inputs){
  $name= $inputs->getAttribute('name');
  //$value = $field->name('id');
  echo "$name =<br>";
}

ВЫВОД

id =
name =
position =
id =
name =
position =
id =
name =
position =

Я хочу, чтобы было выведено id=1 name=Steven Law ... id=3 name=mike pan position=office boy. После этого из вывода я могу сделать массив.

О, еще раз, пожалуйста, расскажите мне о разных XMLDOM и SimpleXML. Я не знаю, должен выбрать что. Помогите пожалуйста мне


person Stfvns    schedule 03.10.2016    source источник


Ответы (2)


Чтение значения можно выполнить с помощью DOMElement::nodeValue:

<?php
$dom = new DOMDocument();
$dom->load("data.xml");

$input = $dom->getElementsByTagName('input');
foreach($input as $inputs){
  $name= $inputs->getAttribute('name');

  $value = $inputs->nodeValue; //reading the value
  echo "$name = $value<br>"; 
}

Уведомление

Чтобы проверить это, нужно исправить пример XML: в первом блоке элементы <input> закрываются с помощью </field>. Это должно быть изменено на </input>.

Вы просили массив. Это зависит от того, как вам нужны данные в вашем приложении. Вот две возможности, которые должны дать вам представление о том, что делать дальше:

a) Создание массива (простой способ)

<?php
$dom = new DOMDocument();
$dom->load("data.xml");

$array=array(); //init

$input = $dom->getElementsByTagName('input');
foreach($input as $inputs){
  $name= $inputs->getAttribute('name');
  $value = $inputs->nodeValue;

  //adding a value
  $array[]=array(
    'name' => $name,
    'value' => $value,
    );
}
// as an example, just print it
print_r($array);

Вы получите что-то вроде этого:

Array
(
    [0] => Array
        (
            [name] => id
            [value] => 1
        )

    [1] => Array
        (
            [name] => name
            [value] => Steven Law
        )

    [2] => Array
        (
            [name] => position
            [value] => Sales Manager
        )

    [3] => Array
        (
            [name] => id
            [value] => 2
        )

    [4] => Array
        (
            [name] => name
            [value] => Martin Wow
        )

    [5] => Array
        (
            [name] => position
            [value] => Production
        )

    [6] => Array
        (
            [name] => id
            [value] => 3
        )

    [7] => Array
        (
            [name] => name
            [value] => Mike Pan
        )

    [8] => Array
        (
            [name] => position
            [value] => Office boy
        )
)

b) Создание массива (удобнее использовать позже)

<?php
$dom = new DOMDocument();
$dom->load("data.xml");

//init
$array=array();
//get all form tags
$forms=$dom->getElementsByTagName('form');
foreach($forms as $form) {
    //get all input-Tags from this form
    $input = $form->getElementsByTagName('input');

    //create an empty element
    $element=array();
    //walk through the input elements of the current form element
    foreach($input as $inputs){
      $name= $inputs->getAttribute('name');
      $value = $inputs->nodeValue;
      //add the data to the element
      $element[$name]=$value;
    }
    //add the element to your array
    $array[]=$element;
}
// as an example, just print it
print_r($array);

Здесь вы сначала пройдетесь по своим <form> элементам. Затем в каждой форме вы читаете <input> элементов. Итак, вы получите запись для каждого блока формы, содержащего входные данные:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Steven Law
            [position] => Sales Manager
        )

    [1] => Array
        (
            [id] => 2
            [name] => Martin Wow
            [position] => Production
        )

    [2] => Array
        (
            [id] => 3
            [name] => Mike Pan
            [position] => Office boy
        )

)
person akrys    schedule 03.10.2016
comment
извините, это моя ошибка для закрытия с field . спасибо, я постараюсь как можно скорее - person Stfvns; 03.10.2016
comment
пожалуйста, помогите мне тоже. сделать массив. и расскажите мне о dom или simplexml, который я должен использовать. Обновите свой ответ, пожалуйста @akrys - person Stfvns; 03.10.2016
comment
simplexml легче кодировать, domxml немного более терпим к небольшим ошибкам XML. Это зависит от того, какой API вы хотите использовать. - person akrys; 03.10.2016
comment
@akrys Что касается устойчивости к ошибкам, вы всегда можете использовать режим синтаксического анализа HTML DOM, а затем использовать simplexml_import_dom для преобразования объекта в SimpleXML (без какой-либо дополнительной обработки - они используют одно и то же внутреннее представление). Таким образом, вы получите лучшее из обоих (если вам нравится упрощенный стиль API SimpleXML). - person IMSoP; 04.10.2016
comment
Это отличный намек! В следующий раз мне не нужно переделывать весь мой код. Спасибо - person akrys; 04.10.2016

Попробуйте simplehtmldom, его проще использовать, чем xmldom или simplexml. Вы должны иметь возможность использовать селекторы css для поиска нужных данных.

person alanmbarr    schedule 03.10.2016
comment
Вы не говорите мне код для получения значения элемента. Главный вопрос касается кода. Что за простота? Я не слышал этого до сих пор - person Stfvns; 03.10.2016