这里有新鲜出炉的 PHP 面向对象编程,程序狗速度看过来!
PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,入门门槛较低,易于学习,使用广泛,主要适用于 web 开发领域。PHP 的文件后缀名为 php。
这篇文章主要介绍了 PHP 读取 XML 格式文件的方法, 结合实例形式总结分析了 php 针对 xml 格式文件的读取、解析、加载、遍历等操作技巧, 需要的朋友可以参考下
本文实例总结了 PHP 读取 XML 格式文件的方法。分享给大家供大家参考,具体如下:
books.xml 文件:
- <books>
- <book>
- <author>Jack Herrington</author>
- <title>PHP Hacks</title>
- <publisher>O'Reilly</publisher>
- </book>
- <book>
- <author>Jack Herrington</author>
- <title>Podcasting Hacks</title>
- <publisher>O'Reilly</publisher>
- </book>
- </books>
1.DOMDocument 方法
- <?php
- $doc = new DOMDocument();
- $doc->load( 'books.xml' );
- $books = $doc->getElementsByTagName( "book" );
- foreach( $books as $book )
- {
- $authors = $book->getElementsByTagName( "author" );
- $author = $authors->item(0)->nodeValue;
- $publishers = $book->getElementsByTagName( "publisher" );
- $publisher = $publishers->item(0)->nodeValue;
- $titles = $book->getElementsByTagName( "title" );
- $title = $titles->item(0)->nodeValue;
- echo "$title - $author - $publisher\n";
- echo "<br>";
- }
- ?>
2. 用 SAX 解析器读取 XML:
- <?php
- $g_books = array();
- $g_elem = null;
- function startElement( $parser, $name, $attrs )
- {
- global $g_books, $g_elem;
- if ( $name == 'BOOK' ) $g_books []= array();
- $g_elem = $name;
- }
- function endElement( $parser, $name )
- {
- global $g_elem;
- $g_elem = null;
- }
- function textData( $parser, $text )
- {
- global $g_books, $g_elem;
- if ( $g_elem == 'AUTHOR' ||
- $g_elem == 'PUBLISHER' ||
- $g_elem == 'TITLE' )
- {
- $g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text;
- }
- }
- $parser = xml_parser_create();
- xml_set_element_handler( $parser, "startElement", "endElement" );
- xml_set_character_data_handler( $parser, "textData" );
- $f = fopen( 'books.xml', 'r' );
- while( $data = fread( $f, 4096 ) )
- {
- xml_parse( $parser, $data );
- }
- xml_parser_free( $parser );
- foreach( $g_books as $book )
- {
- echo $book['TITLE']." - ".$book['AUTHOR']." - ";
- echo $book['PUBLISHER']."\n";
- }
- ?>
3. 用正则表达式解析 XML:
- <?php
- $xml = "";
- $f = fopen( 'books.xml', 'r' );
- while( $data = fread( $f, 4096 ) ) {
- $xml .= $data;
- }
- fclose( $f );
- preg_match_all( "/\<book\>(.*?)\<\/book\>/s", $xml, $bookblocks );
- foreach( $bookblocks[1] as $block )
- {
- preg_match_all( "/\<author\>(.*?)\<\/author\>/", $block, $author );
- preg_match_all( "/\<title\>(.*?)\<\/title\>/", $block, $title );
- preg_match_all( "/\<publisher\>(.*?)\<\/publisher\>/", $block, $publisher );
- echo( $title[1][0]." - ".$author[1][0]." - ".$publisher[1][0]."\n" );
- }
- ?>
4. 解析 XML 到数组
- <?php
- $data = "<root><line /><content language=\"gb2312\">简单的XML数据</content></root>";
- $parser = xml_parser_create(); //创建解析器
- xml_parse_into_struct($parser, $data, $values, $index); //解析到数组
- xml_parser_free($parser); //释放资源
- //显示数组结构
- echo "\n索引数组\n";
- print_r($index);
- echo "\n数据数组\n";
- print_r($values);
- ?>
5. 检查 XML 是否有效
- <?php
- //创建XML解析器
- $xml_parser = xml_parser_create();
- //使用大小写折叠来保证能在元素数组中找到这些元素名称
- xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
- //读取XML文件
- $xmlfile = "bb.xml";
- if (!($fp = fopen($xmlfile, "r")))
- {
- die("无法读取XML文件$xmlfile");
- }
- //解析XML文件
- $has_error = false; //标志位
- while ($data = fread($fp, 4096))
- {
- //循环地读入XML文档,只到文档的EOF,同时停止解析
- if (!xml_parse($xml_parser, $data, feof($fp)))
- {
- $has_error = true;
- break;
- }
- }
- if($has_error)
- {
- echo "该XML文档是错误的!<br />";
- //输出错误行,列及其错误信息
- $error_line = xml_get_current_line_number($xml_parser);
- $error_row = xml_get_current_column_number($xml_parser);
- $error_string = xml_error_string(xml_get_error_code($xml_parser));
- $message = sprintf("[第%d行,%d列]:%s",
- $error_line,
- $error_row,
- $error_string);
- echo $message;
- }
- else
- {
- echo "该XML文档是结构良好的。";
- }
- //关闭XML解析器指针,释放资源
- xml_parser_free($xml_parser);
- ?>
6. 可用于精确的读取 XML
test.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <SBMP_MO_MESSAGE>
- <CONNECT_ID>100</CONNECT_ID>
- <MO_MESSAGE_ID>123456</MO_MESSAGE_ID>
- <RECEIVE_DATE>20040605</RECEIVE_DATE>
- <RECEIVE_TIME>153020</RECEIVE_TIME>
- <GATEWAY_ID>1</GATEWAY_ID>
- <VALID>1</VALID>
- <CITY_CODE>010</CITY_CODE>
- <CITY_NAME>北京</CITY_NAME>
- <STATE_CODE>010</STATE_CODE>
- <STATE_NAME>北京</STATE_NAME>
- <TP_PID>0</TP_PID>
- <TP_UDHI>0</TP_UDHI>
- <MSISDN>15933626501</MSISDN>
- <MESSAGE_TYPE>8</MESSAGE_TYPE>
- <MESSAGE>5618常年供应苗木,品种有玉兰、黄叶杨等。联系人:张三,电话:1234567890。</MESSAGE>
- <LONG_CODE>100</LONG_CODE>
- <SERVICE_CODE>9588</SERVICE_CODE>
- </SBMP_MO_MESSAGE>
test.php:
- <?php
- $myData = array();
- $file = file_get_contents("test.xml");
- if(strpos($file, '<?xml') > -1) {
- try {
- //加载解析xml
- $xml = simplexml_load_string($file);
- if($xml) {
- //echo $this->result;
- //获取节点值
- $CONNECT_ID = $xml->CONNECT_ID;
- $MO_MESSAGE_ID = $xml->MO_MESSAGE_ID;
- $RECEIVE_DATE = $xml->RECEIVE_DATE;
- $RECEIVE_TIME = $xml->RECEIVE_TIME;
- $GATEWAY_ID = $xml->GATEWAY_ID;
- $VALID = $xml->VALID;
- $CITY_CODE = $xml->CITY_CODE;
- $CITY_NAME = $xml->CITY_NAME;
- $STATE_CODE = $xml->CITY_CODE;
- $STATE_NAME = $xml->STATE_NAME;
- $TP_PID = $xml->TP_PID;
- $TP_UDHI = $xml->TP_UDHI;
- $MSISDN = $xml->MSISDN;
- $MESSAGE_TYPE = $xml->MESSAGE_TYPE;
- $MESSAGE = $xml->MESSAGE;//短信
- $LONG_CODE = $xml->LONG_CODE;
- $SERVICE_CODE = $xml->SERVICE_CODE;
- preg_match("/(561)\d{1,2}/", $MESSAGE, $code);
- switch($code[0]) {
- case 5618 :
- $myData[message] = $MESSAGE;
- break;
- default :
- $myData[] = '没有短消息。';
- break;
- }
- } else {
- echo "加载xml文件错误。";
- }
- } catch(exception $e){
- print_r($e);
- }
- } else {
- echo "没有该XML文件。";
- }
- echo "<pre>";
- print_r($myData);
- echo "<hr>";
- echo $myData[message];
- ?>
希望本文所述对大家 PHP 程序设计有所帮助。
来源: http://www.phperz.com/article/17/0807/340449.html