本文实例总结了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程序设计有所帮助。