Конвертировать 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. Я не знаю, должен выбрать что. пожалуйста, помогите мне

0

Решение

Чтение значения может быть сделано с 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>,

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

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

<?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
)
)

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

<?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
)

)
1

Другие решения

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

-1

По вопросам рекламы [email protected]