2010-10-15 2 views
1

У меня есть строковая переменная, содержащая XML-данные, и мне было интересно, есть ли простой способ извлечь поля и данные из файла. Через итеративный общий способ, без указания имени тегов в коде.Как динамически извлекать данные из XML в PHP?

+0

почему вы не читали инструкцию PHP? – cweiske

+0

Ну, в его защиту у меня возникли трудности с поиском simpleXML в первый раз. Руководство по PHP довольно большое, и небольшая подсказка от пользователей SO быстро и полезно. – Shikiryu

+0

Я согласен с Chouchenos –

ответ

5

Вы можете использовать SimpleXML.

Загрузите данные с simplexml_load_string И тогда вы можете сделать петлю для разбора XML в массив, благодаря SimpleXML class

Как это называется, это довольно просто сделать.

1

Есть many XML parsing libraries, каждый из которых имеет свои сильные стороны и раздражения, поэтому вы найдете широкий спектр решений.

Однако, это хороший snipplet, который небольшой, быстрый и функции независимо от того, какие библиотеки установлены, потому что это регулярное выражение.

Вы feed it an XML string and it returns an array of the whole dynamic structure:

$xml = file_get_contents('example.xml'); 
$data = xml2array($xml); 
echo "<pre>" . print_r($data, true) . "</pre>"; 

Функция:

function xml2array($xml) { 
$xmlary = array(); 
$reels = '/<(\w+)\s*([^\/>]*)\s*(?:\/>|>(.*)<\/\s*\\1\s*>)/s'; 
$reattrs = '/(\w+)=(?:"|\')([^"\']*)(:?"|\')/'; 
preg_match_all($reels, $xml, $elements); 
foreach ($elements[1] as $ie => $xx) { 
    $xmlary[$ie]["name"] = $elements[1][$ie]; 
    if ($attributes = trim($elements[2][$ie])) { 
    preg_match_all($reattrs, $attributes, $att); 
    foreach ($att[1] as $ia => $xx) 
     $xmlary[$ie]["attributes"][$att[1][$ia]] = $att[2][$ia]; 
    } 
    $cdend = strpos($elements[3][$ie], "<"); 
    if ($cdend > 0) { 
    $xmlary[$ie]["text"] = substr($elements[3][$ie], 0, $cdend - 1); 
    } 
    if (preg_match($reels, $elements[3][$ie])) 
    $xmlary[$ie]["elements"] = xml2array($elements[3][$ie]); 
    else if ($elements[3][$ie]) { 
    $xmlary[$ie]["text"] = $elements[3][$ie]; 
    } 
} 
return $xmlary; 
} 
Смежные вопросы