2013-11-09 2 views
0

Мой файл XML выглядит следующим образом:Создать массив из XML-файла

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <item> 
    <Post> 
     <id><![CDATA[1]]></id> 
     <title><![CDATA[The title]]></title> 
     <body><![CDATA[This is the post body.]]></body> 
     <created><![CDATA[2008-07-28 12:01:06]]></created> 
     <modified><![CDATA[]]></modified> 
    </Post> 
    </item> 
    <item> 
    <Post> 
     <id><![CDATA[2]]></id> 
     <title><![CDATA[A title once again]]></title> 
     <body><![CDATA[And the post body follows.]]></body> 
     <created><![CDATA[2008-07-28 12:01:06]]></created> 
     <modified><![CDATA[]]></modified> 
     <item> 
     <item><![CDATA[fdgs]]></item> 
     </item> 
    </Post> 
    </item> 
    <item> 
    <Post> 
     <id><![CDATA[3]]></id> 
     <title><![CDATA[Title strikes back]]></title> 
     <body><![CDATA[This is really exciting Not.]]></body> 
     <created><![CDATA[2008-07-28 12:01:06]]></created> 
     <modified><![CDATA[]]></modified> 
    </Post> 
    </item> 
</root> 

Вот мой ожидаемый результат:

Array(
0=>Array(
    'Post'=>Array(
     'id'=>1, 
     'title'=>'The title', 
     'body'=>'This is the post body.', 
     'created'=>'2008-07-28 12:01:06', 
     'modified'=>'',) 
     ), 
1=>Array(
    'Post'=>Array(
     'id'=>2, 
     'title'=>'A title once again', 
     'body'=>'And the post body follows.', 
     'created'=>'2008-07-28 12:01:06', 
     'modified'=>'', 
     array('fdgs'),) 
     ), 
2=>Array(
    'Post'=>Array(
     'id'=>3, 
     'title'=>'Title strikes back', 
     'body'=>'This is really exciting Not.', 
     'created'=>'2008-07-28 12:01:06', 
     'modified'=>'',) 
     ), 
); 

И это мой код:

$xml=new Xml2Array(); 
     $xmlData = simplexml_load_file('d:\\xmlfile\\Array2XmlExampleData.xml'); 
     $expectedResult=$xml->simpleXMLToArray($xmlData); 
     var_dump($expectedResult); 

Результат массива, получаемый из var_dump(), равен null. Как я могу решить эту проблему? Пожалуйста, помогите мне, спасибо.

ответ

0

Вы не представили соответствующее, что является функцией simpleXMLToArray(). Поэтому мы не можем сказать, что не так с вашим кодом.

Но превращение SimpleXML-объект в массив на самом деле не так уж трудно - вот один из способов сделать это:

$array = json_decode(json_encode((array) $xmlData), true); 

преобразует заданную XML в массив. Но чтобы заставить его работать в вашем случае вы должны убедиться, что вы загружаете данные с LIBXML_NOCDATA флагом (see documentation):

$xmlData = simplexml_load_file('d:\\xmlfile\\Array2XmlExampleData.xml', 'SimpleXMLElement', LIBXML_NOCDATA);

Теперь вы просто загрузите XML, перебирать <item> -tags и конвертировать их массивы:

$xmlData = simplexml_load_file(
     'd:\\xmlfile\\Array2XmlExampleData.xml', 
     'SimpleXMLElement', 
     LIBXML_NOCDATA 
); 

$results = []; 

foreach($xmlData->item as $item) 
{ 
    $results[] = json_decode(json_encode((array)$item), true); 
} 

Вот working example. Конечно, вам нужно добавить свою логику санитарии, чтобы отфильтровать нежелательные элементы или сделать некоторое форматирование. Но ты получил идею.

Кроме того, убедитесь, что xml загружен правильно и что ваше приложение имеет разрешения на чтение для файла.

+0

Привет, Спасибо, но главная проблема в моей функции здесь Существует состояние, если (! ($ XML InstanceOf SimpleXMLElement)) который возвращает логическое значение (FALSE), если я проверю, что с помощью var_dump (get_class ($ XML)); Он возвращает SimpleXMLElement. Итак, как это возможно ??? – user2715247

+0

@ user2715247 Трудно сказать, не видя всего кода. Вы можете отредактировать сообщение и добавить код функции 'simpleXMLToArray()' и сообщить, что именно вы пытаетесь сделать для того, чтобы достичь (зачем вам нужно проверять тип ...?). 'if (! ($ xml instanceof SimpleXMLElement))' оценивается как 'false', потому что вы действительно проверяете, является ли $ xml ** NOT ** экземпляром SimpleXMLElement. Поэтому, если это правда, вы возвращаете NOT True, что неверно. Он отлично работает для меня: http://codepad.viper-7.com/hNOB30 – Quasdunk

Смежные вопросы