如何在PHP中从XML动态提取数据?

时间:2010-10-15 12:33:24

标签: php xml

我有一个字符串变量,包含XML数据,我想知道是否有一种从文件中提取字段和数据的简单方法。通过迭代的泛型方式,无需在代码中指定标记的名称。

2 个答案:

答案 0 :(得分:5)

您可以使用SimpleXML。

使用simplexml_load_string加载您的数据 然后,由于SimpleXML class

,您可以创建一个循环来将xml解析为数组

正如它所说的那样,这很简单。

答案 1 :(得分:1)

many XML parsing libraries,每个都有自己的优点和烦恼,所以你会找到广泛的解决方案。

但是,这里有一个很小的,快速的函数,无论安装了什么库,因为它是一个正则表达式。

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;
}