有两种基本的 XML 解析器类型:
基于树的解析器:这种解析器把 XML 文档转换为树型结构。它分析整篇文档,并提供了 API 来访问树种的元素,例如文档对象模型 (DOM)。
基于事件的解析器:将 XML 文档视为一系列的事件。当某个具体的事件发生时,解析器会调用函数来处理。

一、XML Expat 解析器(基于事件)
XML 文件:



George
John
Reminder
Don't forget the meeting!

PHP 代码:

";
    break; 
    case "TO":
    echo "To: ";
    break; 
    case "FROM":
    echo "From: ";
    break; 
    case "HEADING":
    echo "Heading: ";
    break; 
    case "BODY":
    echo "Message: ";
    }
  }

//Function to use at the end of an element
function stop($parser,$element_name)
  {
  echo "
"; } //Function to use when finding character data function char($parser,$data) { echo $data; } //Specify element handler xml_set_element_handler($parser,"start","stop"); //Specify data handler xml_set_character_data_handler($parser,"char"); //Open XML file $fp=fopen("test.xml","r"); //Read data while ($data=fread($fp,4096)) { xml_parse($parser,$data,feof($fp)) or die (sprintf("XML Error: %s at line %d", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser))); } //Free the XML parser xml_parser_free($parser); ?>

以上代码的输出:
-- Note --
To: George
From: John
Heading: Reminder
Message: Don't forget the meeting!
工作原理解释:
通过 xml_parser_create() 函数初始化 XML 解析器
创建配合不同事件处理程序的的函数
添加 xml_set_element_handler() 函数来定义,当解析器遇到开始和结束标签时执行哪个函数
添加 xml_set_character_data_handler() 函数来定义,当解析器遇到字符数据时执行哪个函数
通过 xml_parse() 函数来解析文件 "test.xml"
万一有错误的话,添加 xml_error_string() 函数把 XML 错误转换为文本说明
调用 xml_parser_free() 函数来释放分配给 xml_parser_create() 函数的内存

二、DOM 解析器(基于树的解析器)
XML 文件:



George
John
Reminder
Don't forget the meeting!

PHP代码:

$xmlDoc = new DOMDocument();
$xmlDoc->load("note.xml");

print $xmlDoc->saveXML(); 
//以上代码输出 George John Reminder Don't forget the meeting!
//循环  元素的所有元素
$x = $xmlDoc->documentElement;
foreach ($x->childNodes AS $item)
  {
  print $item->nodeName . " = " . $item->nodeValue . "
"; } ?> //获取属性值
load('attr.xml'))  //这里也可以是online的xml文件
    {  
        echo "load books.xml failed!
"; return; } $foos = $dom->getElementsByTagName('foo'); $var = $foos->item(0)->getAttribute('xmlns'); echo 'var=' . $var . '
'; $bars = $dom->getElementsByTagName('bar'); foreach ($bars as $bar) { $arr[] = $bar->getAttribute('attr'); } ?>

XML 实例
三、 SimpleXML 可把 XML 文档转换为对象

getName() . "
"; foreach($xml->children() as $child){ echo $child->getName() . ": " . $child . "
"; } ?>

SimpleXML 函数
四、用正则表达式解析XML

(.*?)\<\/book\>/s", 
$xml, $bookblocks );

foreach( $bookblocks[1] as $block )
{
preg_match_all( "/\(.*?)\<\/author\>/", 
$block, $author );
preg_match_all( "/\(.*?)\<\/title\>/", 
$block, $title );
preg_match_all( "/\(.*?)\<\/publisher\>/", 
$block, $publisher );
echo( $title[1][0]." - ".$author[1][0]." - ".
$publisher[1][0]."\n" );
}
?>

标签: xml解析, xml

添加新评论