本文实例总结了PHP读取XML格式文件的方法。分享给大家供大家参考,具体如下:
books.xml文件:
1
2
3
4
5
6
7
8
9
10
11
12
|
< 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方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<?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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?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到数组
1
2
3
4
5
6
7
8
9
10
11
|
<?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是否有效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<? 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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
<?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程序设计有所帮助。