XML相关技术探讨

xml数据经常作为一种数据格式广泛运用在web接口中。“可扩展标记语言(XML)被称为标记语言和基于文本的数据存储格式,这要看对谁来说。它是标准通用标记语言(SGML)的一个子集,采用文本方式应用和描述信息的树状结构。XML 是很多语言/格式的基础,如 Really Simple Syndication (RSS)、Mozilla 的 XML User Interface Language (XUL)、Macromedia 的 Maximum eXperience Markup Language (MXML)、Microsoft 的 eXtensible Application Markup Language (XAML) 以及开放源代码的 Java XML UI Markup Language (XAMJ)。”——IBM developworks
在php中对xml数据的处理有很多种方式,本文会梳理下xml相关知识以及对利用PHP对XML数据的几种解析方式做一个小小的总结:对XML的解析主要有树和流两种方式,各有不同的适用场景.用树的方式解析,需要将整个XML加载到内存。树型解析的例子包括DOM和SimpleXML(基于libxml2)。流解析不需要将整个文档加载到内存中。是按需加载,只能访问当前解析的节点,适用于解析大型xml文件。流解析器的例子包括XMLReader和SAX。
示例xml文件:xmltest.xml

<?xml version="1.0" encoding="UTF-8"?>
<SeachData>
	<item id="first">
		<title id="ftitle"><![CDATA[樱桃红]]></title>
		<subtitle><![CDATA[38集电视剧 在线观看]]></subtitle>
		<url><![CDATA[http://tv.2345.com/detail/18922.html]]></url>
		<tag>1</tag>
		<describ><![CDATA[主演:宋小宝 沈春阳 赵本山]]></describ>
		<type>2</type>
	</item>
	<item id="second">
		<title id="stitle"><![CDATA[贤妻]]></title>
		<subtitle><![CDATA[30集电视剧 在线观看]]></subtitle>
		<url><![CDATA[http://tv.2345.com/detail/19716.html]]></url>
		<tag>1</tag>
		<describ><![CDATA[主演:刘涛 保剑锋 谢祖武]]></describ>
		<type>2</type>
	</item>
</SeachData>

树解析:

1.DOM解析

<?php
$xml = new DOMDocument();
$xml->load('xmltest.xml');
$xml->preserveWhiteSpace = false;
$data = $xml->getElementsByTagName('item');

foreach( $data as $k=>$v )
{
	//$v是DOMElement
	echo $data->item($k)->getAttribute('id')."\n";
	//DOMNodeList 
	$titleNode = $v->getElementsByTagName('title');
	foreach ($titleNode as $k2 => $v2)
	{
		echo $v2->nodeValue. "\n";
	}
}

输出:

first
樱桃红
second
贤妻

DOM和XPATH解析

<?php
$xml = new DOMDocument;
$xml->preserveWhiteSpace = false;
$xml->load('xmltest.xml');

$xpath = new DOMXPath($xml);

// We start from the root element
$query = '//item/title';

//DOMNodeList Object
$entries = $xpath->query($query);

foreach ($entries as $k=>$v) {
	echo $v->nodeValue . "\n";
	echo "Found {$v->nextSibling->nodeValue}," . " by {$v->nodeValue}\n";
}

输出:

樱桃红
Found 38集电视剧 在线观看, by 樱桃红
贤妻
Found 30集电视剧 在线观看, by 贤妻

是不是很像js解析html,^_^

XPATH资料

 

2.SimpleXML解析

<?php
$xmlString = file_get_contents('xmltest.xml');
$xml = new SimpleXMLElement($xmlString);
echo $xml->item[0]->title;

输出:

樱桃红
38集电视剧 在线观看

在此值得一提的有三个函数:

simplexml_import_dom(将一个dom节点转化为SimpleXMLElement对象,相反功能的一个函数dom_import_simplexml)
simplexml_load_file(加载xml文件,得到SimpleXMLElement对象)
simplexml_load_string(加载格式化的xml字符串,得到SimpleXMLElement对象)

 

 

流解析
1.XMLReader解析

nodeType属性 取值 说明
1 代表标签的开始
15 代表标签的介绍
14 代表空标签体
3 代表标签体内容

<?php
$reader = new XMLReader();
$reader->open("testxml.xml");
while ($reader->read()) {
	switch ($reader->nodeType) {
		case (XMLREADER::ELEMENT):
			if ($reader->localName == 'item') {
				$domElement = $reader->expand();
				$dom = new DOMDocument();
				$domNode = $dom->importNode($domElement, TRUE);
				$simpleXml = simplexml_import_dom($domNode);
				echo $simpleXml->title . "\n";
				echo $simpleXml->subtitle . "\n";
				echo $simpleXml->url . "\n";
				echo "------------\n";
			}
	}
}

输出:

樱桃红
38集电视剧 在线观看
http://tv.2345.com/detail/18922.html
------------
贤妻
30集电视剧 在线观看
http://tv.2345.com/detail/19716.html
------------

 

2.SAX解析Simple API for XML (SAX),这个用的少了,大文件用XMLReader配合前面的DOMDocument和SimpleXML基本可以搞定一切

Simple API for XML (SAX) 
<?php
$g_items = array ();
$g_elem = null;
function startElement($parser, $name, $attrs) {
	global $g_items, $g_elem;
	if ($name == 'item')
		$g_items [] = array ();
	$g_elem = $name;
}
function endElement($parser, $name) {
	global $g_elem;
	$g_elem = null;
}
function textData($parser, $text) {
	global $g_items, $g_elem;
	if ($g_elem == 'TITLE') {
		$g_items [] = $text;
	}
}

$parser = xml_parser_create ();

xml_set_element_handler ( $parser, "startElement", "endElement" );
xml_set_character_data_handler ( $parser, "textData" );

$f = fopen ( 'testxml.xml', 'r' );

while ( $data = fread ( $f, 4096 ) ) {
	xml_parse ( $parser, $data );
}

xml_parser_free ( $parser );
foreach ( $g_items as $item ) {
	echo $item . "\n";
}

输出:

樱桃红
贤妻

 

以上就是总结的几点对php对xml数据的解析了,今天写了这几个例子跑了下,也熟悉了想相关的函数和类,当然关于xml还有很多其他知识点,暂不讨论了。转载请注明出处: CoderAladdin