Heim >php教程 >php手册 >怎么用php解析xml文件

怎么用php解析xml文件

WBOY
WBOYOriginal
2016-05-25 16:42:021145Durchsuche

xml文件是一种数据存储格式,下面小编给大家介绍php解析xml格式文件的多种方法总结介绍,DOMDocument是我们常用的解析xml一个不错的方法,下面我来给大家总结总结.

DOMElement:DOMElement DOMDocument::createElement ( string $name [, string $value ] )

创建节点元素:

String $name:节点名

String $value:节点的值

添加节点:

•DOMNode DOMNode::appendChild ( DOMNode $newnode ) 

添加子节点:

DOMNode $newnode:新节点

在dom操作中,增删改操作必须依赖于父节点

保存:

•string DOMDocument::saveXML 

保存至某个字符串中

•int DOMDocument::save ( string $filename ) 

保存至某个文件中

String $filename:文件名

删除节点

•DOMNode DOMNode::removeChild ( DOMNode $oldnode ) 

删除节点

DOMNode $oldnode:要删除的节点

更新节点

•DOMNode DOMNode::replaceChild ( DOMNode $newnode , DOMNode $oldnode ) 

DOMNode $newnode:新节点

DOMNode $oldnode:原节点

添加属性

•DOMAttr DOMElement::setAttribute( string $name , string $value ) 

string $name:属性名

string $value:属性值

修改属性

DOMAttr DOMElement::setAttribute( string $name , string $value ) 

string $name:属性名

string $value:属性值

删除属性

•bool DOMElement::removeAttribute ( string $name )

string $name:要删除的属性名称

获取属性

•string DOMElement::getAttribute ( string $name )

string $name:要获取的属性值的属性名

DOMDocument还是PHP5后推出的DOM扩展的一部分,可用来建立或解析html/xml,目前只支持utf-8编码,代码如下:

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

SimpleXML

SimpleXML是PHP5后提供的一套简单易用的xml工具集,可以把xml转换成方便处理的对象,也可以组织生成xml数据,不过它不适用于包含namespace的xml,而且要保证xml格式完整(well-formed),它提供了三个方法:simplexml_import_dom、simplexml_load_file、simplexml_load_string,函数名很直观地说明了函数的作用,三个函数都返回SimpleXMLElement对象,数据的读取/添加都是通过SimpleXMLElement操作,代码如下:

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

SimpleXML的优点是开发简单,缺点是它会将整个xml载入内存后再进行处理,所以在解析超多内容的xml文档时可能会力不从心,如果是读取小文件,而且xml中也不包含namespace,那SimpleXML是很好的选择.

XMLReader

XMLReader也是PHP5之后的扩展(5.1后默认安装),它就像游标一样在文档流中移动,并在每个节点处停下来,操作起来很灵活,它提供了对输入的快速和非缓存的流式访问,可以读取流或文档,使用户从中提取数据,并跳过对应用程序没有意义的记录.

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

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

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

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

本文地址:

转载随意,但请附上文章地址:-)

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