2016-10-03 7 views
0

У меня есть 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> 

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

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

ответ

1

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

) 
+0

жаль, что это моя ошибка для закрытых с полем. спасибо, я попробую как можно скорее – Stfvns

+0

, пожалуйста, помогите мне тоже. для создания массива. и расскажите мне о dom или simplexml, должен ли я использовать. Обновите ответ, пожалуйста, @akrys – Stfvns

+0

'simplexml' проще кодировать,' domxml' немного более терпимо к меньшим ошибкам XML. Это зависит от того, какой API вы хотите использовать. – akrys

-1

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

+0

Вы не сказали мне код, чтобы получить значение элемента. Вопрос по поводу вопроса о коде. Какой простой хелм? Я не слышу этого до сих пор – Stfvns

+0

http://simplehtmldom.sourceforge.net/ http://simplehtmldom.sourceforge.net/manual.htm – alanmbarr