php解析xml字符串[重复]
Posted
技术标签:
【中文标题】php解析xml字符串[重复]【英文标题】:php parse xml string [duplicate] 【发布时间】:2011-04-07 13:10:24 【问题描述】:可能重复:Best XML Parser for php
我有一个包含 XML 数据的字符串。如何在 PHP 中解析它?
谢谢
【问题讨论】:
【参考方案1】:如果您熟悉 Zend 框架,请将您的 XML 传递给 Zend_Config_Xml
像这样给定xml
$myXml = '
<?xml version="1.0" ?>
<top>
<var>value</var>
<nested>
<var>value</var>
</nested>
<arrayVar>
<item>1</item>
<item>2</item>
<item>3</item>
</arrayVar>
</top>';
你可以这样访问它:
$xml = new Zend_Config_Xml( $myXml );
$var = $xml->var;
$nestedVar = $xml->nested->var;
$arrayVar = $xml->arrayVar->toArray();
Zend Config XML 使用 simplexml 并在此基础上构建以提供一个漂亮的界面,这使得访问您正在寻找的 xml 节点变得非常容易。
ZF 手册中有更多内容,包括如何访问属性以及其他一些非常有用的功能。
http://framework.zend.com/manual/en/zend.config.adapters.xml.html
Zend Config 是 ZF 中最容易使用的部分之一,而且(我认为)它是一个独立的组件,您可以只使用 Zend Config 而不能使用 ZF 的其他部分
【讨论】:
【参考方案2】:对于那些 SimpleXML 不可用的情况,我使用了这个函数,这个函数最初发表在 php.net 上的评论中。它在 99% 的时间里都很好用。
<?php
/**
* Convert XML to an Array
*
* @param string $XML
* @return array
*/
function XMLtoArray($XML)
$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $XML, $vals);
xml_parser_free($xml_parser);
// wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie
$_tmp='';
foreach ($vals as $xml_elem)
$x_tag=$xml_elem['tag'];
$x_level=$xml_elem['level'];
$x_type=$xml_elem['type'];
if ($x_level!=1 && $x_type == 'close')
if (isset($multi_key[$x_tag][$x_level]))
$multi_key[$x_tag][$x_level]=1;
else
$multi_key[$x_tag][$x_level]=0;
if ($x_level!=1 && $x_type == 'complete')
if ($_tmp==$x_tag)
$multi_key[$x_tag][$x_level]=1;
$_tmp=$x_tag;
// jedziemy po tablicy
foreach ($vals as $xml_elem)
$x_tag=$xml_elem['tag'];
$x_level=$xml_elem['level'];
$x_type=$xml_elem['type'];
if ($x_type == 'open')
$level[$x_level] = $x_tag;
$start_level = 1;
$php_stmt = '$xml_array';
if ($x_type=='close' && $x_level!=1)
$multi_key[$x_tag][$x_level]++;
while ($start_level < $x_level)
$php_stmt .= '[$level['.$start_level.']]';
if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level])
$php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']';
$start_level++;
$add='';
if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete'))
if (!isset($multi_key2[$x_tag][$x_level]))
$multi_key2[$x_tag][$x_level]=0;
else
$multi_key2[$x_tag][$x_level]++;
$add='['.$multi_key2[$x_tag][$x_level].']';
if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes', $xml_elem))
if ($x_type == 'open')
$php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
else
$php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];';
eval($php_stmt_main);
if (array_key_exists('attributes', $xml_elem))
if (isset($xml_elem['value']))
$php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
eval($php_stmt_main);
foreach ($xml_elem['attributes'] as $key=>$value)
$php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;';
eval($php_stmt_att);
return $xml_array;
?>
【讨论】:
【参考方案3】:试试simple XML,这是一个例子:
do.php:
<?php
$xml_str = file_get_contents('xmlfile.xml');
$xml = new SimpleXMLElement($xml_str);
$items = $xml->xpath('*/item');
foreach($items as $item)
echo $item['title'], ': ', $item['description'], "\n";
xmlfile.xml:
<?xml version="1.0" encoding="UTF-8"?>
<xml>
<items>
<item title="Hello World" description="Hellowing the world.." />
<item title="Hello People" description="greeting people.." />
</items>
</xml>
【讨论】:
以上是关于php解析xml字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在Java(Android)中解析包含XML的字符串[重复]