Heim  >  Artikel  >  Backend-Entwicklung  >  PHP读取操作xml的方法总结

PHP读取操作xml的方法总结

WBOY
WBOYOriginal
2016-06-20 13:04:201048Durchsuche

PHP读取操作xml的方法总结

XML(Extensible Markup Language)即可扩展标记语言,他的用途很多,可以用来存储数据,可以用来做数据交换,为很多种应用软件提示数据等等。

web开发过程中经常会遇到利用程序来读取xml的数据并做相关的解析。

下面我们将对php读取并操作xml的各种方法做一个总结。

php对xml的读取并解析常见的有四种方法,分别是:Xml parser, SimpleXML, XMLReader, DOMDocument,下面对这四种方法分别做一些说明。

(1)Xml parseXML Parser使用Expat XML解析器。Expat是一种基于事件的解析器,它把XML文档视为一系列事件。当某个事件发生时,它调用一个指定的函数处理它。Expat是无验证的解析器,忽略任何链接到文档的DTD。

但是,如果文档的形式不好,则会以一个错误消息结束。由于它基于事件,且无验证,Expat具有快速并适合web应用程序的特性。所以它的优势是性能好,因为它不是将整个xml文档载入内存后再处理,而是边解析边处理。但也正因为如此,它不适合那些要对xml结构做动态调整、或基于xml上下文结构做复杂操作的需求。

如果你只是要解析处理一个结构良好的xml文档,那么它可以很好的完成任务。需要注意的是XML Parser只支持三种编码格式:US-ASCII, ISO-8859-1和UTF-8,如果你的xml数据是其他编码,需要先转换成以上三个之一。

XML Parser常用的解析方式大体有两种(其实就是两个函数):xml_parse_into_struct和xml_set_element_handler。由于XML Parser支持PHP4,适用于于使用老版本的系统。所以这里就不在做深刻的说明了。

对于PHP5环境,建议还是尽量考虑以下三种方法。

(2)DOMDocumentDOMDocument还是PHP5后推出的DOM扩展的一部分,可用来建立或解析html/xml,目前只支持utf-8编码。

下面通过一个例子来说明php通过DOMDocument来读取xml的方法吧。

$xmlstring=<<<XML<br /><?xml version='1.0'?><br /><document><br />  <cmd attr='default'>login</cmd><br />  <login>imdonkey</login><br /></document><br />XML;$dom=new DOMDocument();<br />$dom->loadXML($xmlstring);<br />print_r(getArray($dom->documentElement));<br />function getArray($node){<br />  $array=false;<br />  if($node->hasAttributes()){<br />    foreach ($node->attributes as $attr){<br />      $array[$attr->nodeName]=$attr->nodeValue;<br />    }<br />  }<br />  if($node->hasChildNodes()){<br />    if($node->childNodes->length==1){<br />      $array[$node->firstChild->nodeName]=getArray($node->firstChild);<br />    } else {<br />      foreach ($node->childNodes as $childNode){<br />      if($childNode->nodeType!=XML_TEXT_NODE){<br />        $array[$childNode->nodeName][]=getArray($childNode);<br />      }<br />    }<br />  }<br />  } else {<br />    return $node->nodeValue;<br />  }<br />  return $array;<br />}

从程序上可以看出DOMDocument是一次性将xml载入内存,所以内存问题需要注意。

(3)XMLReaderXMLReader也是PHP5之后的扩展(PHP5.1后默认安装),它就像游标一样在文档流中移动,并在每个节点处停下来,操作起来很灵活。

它提供了对输入的快速和非缓存的流式访问,可以读取流或文档,使用户从中提取数据,并跳过对应用程序没有意义的记录。

下面以一个利用php获取google天气api相关信息的例子展示下XMLReader的使用,这里也只涉及到一小部分函数,更多还请参考官方文档

$xml_uri='http://www.google.com/ig/api?weather=Beijing&hl=zh-cn';<br />$current=array();<br />$forecast=array();<br />$reader=new XMLReader();<br />$reader->open($xml_uri, 'gbk');<br />while ($reader->read()){<br />  //get current data<br />  if($reader->name=="current_conditions" && $reader->nodeType==XMLReader::ELEMENT){<br />    while($reader->read() && $reader->name!="current_conditions"){<br />      $name=$reader->name;<br />      $value=$reader->getAttribute('data');<br />      $current[$name]=$value;<br />    }<br />  }<br />  //get forecast data<br />  if($reader->name=="forecast_conditions" && $reader->nodeType==XMLReader::ELEMENT){<br />    $sub_forecast=array();<br />    while($reader->read() && $reader->name!="forecast_conditions"){<br />      $name=$reader->name;<br />      $value=$reader->getAttribute('data');<br />      $sub_forecast[$name]=$value;<br />    }<br />    $forecast[]=$sub_forecast;<br />  }<br />}<br />$reader->close();

XMLReader和XML Parser类似,都是边读边操作,较大的差异在于SAX模型是一个“推送”模型,其中分析器将事件推到应用程序,在每次读取新节点时通知应用程序,而使用XmlReader的应用程序可以随意从读取器提取节点,可控性更好。

由于XMLReader基于libxml,所以有些函数要参考文档看看是否适用于你的libxml版本。

(4)SimpleXMLSimpleXML也是PHP5后提供的一套简单易用的xml工具集,可以把xml转换成方便处理的对象,也可以组织生成xml数据。不过它不适用于包含namespace(命名空间)的xml,而且要保证xml格式完整(well-formed)。

它提供了三个方法:simplexml_import_dom、simplexml_load_file、simplexml_load_string,这三个函数名很直观地说明了他们的作用。三个函数都是返回SimpleXMLElement对象,数据的读取/添加都是通过SimpleXMLElement操作。

示例如下:

$string = <<<XML<br /><?xml version='1.0'?><br /><document><br />  <cmd>login</cmd><br />  <login>imdonkey</login><br /></document><br />XML;$xml = simplexml_load_string($string);<br />print_r($xml);<br />$login = $xml->login;//这里返回的依然是个SimpleXMLElement对象<br />print_r($login);<br />$login = (string) $xml->login;//在做数据比较时,注意要先强制转换<br />print_r($login);

SimpleXML的优点是开发简单,缺点是它也会将整个xml载入内存后再进行处理,所以在解析超多内容的xml文档时可能会力不从心。

如果是读取小文件,而且xml中也不包含namespace,那SimpleXML是很好的选择。


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn