• 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方法

    复制代码
    代码
     1 <?php
     2 $doc = new DOMDocument();
     3 $doc->load( 'books.xml' );
     4 $books = $doc->getElementsByTagName( "book" );
     5 foreach( $books as $book )
     6 {
     7 $authors = $book->getElementsByTagName( "author" );
     8 $author = $authors->item(0)->nodeValue;
     9 
    10 $publishers = $book->getElementsByTagName( "publisher" );
    11 $publisher = $publishers->item(0)->nodeValue;
    12 
    13 $titles = $book->getElementsByTagName( "title" );
    14 $title = $titles->item(0)->nodeValue;
    15 
    16 echo "$title - $author - $publisher ";
    17 echo "<br>";
    18 }
    19 ?> 
    复制代码

    2.用 SAX 解析器读取 XML

    复制代码
    代码
     1 <?php
     2 $g_books = array();
     3 $g_elem = null;
     4 
     5 function startElement( $parser, $name, $attrs ) 
     6 {
     7 global $g_books, $g_elem;
     8 if ( $name == 'BOOK' ) $g_books []= array();
     9 $g_elem = $name;
    10 }
    11 
    12 function endElement( $parser, $name ) 
    13 {
    14 global $g_elem;
    15 $g_elem = null;
    16 }
    17 
    18 function textData( $parser, $text )
    19 {
    20 global $g_books, $g_elem;
    21 if ( $g_elem == 'AUTHOR' ||
    22 $g_elem == 'PUBLISHER' ||
    23 $g_elem == 'TITLE' )
    24 {
    25 $g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text;
    26 }
    27 }
    28 
    29 $parser = xml_parser_create();
    30 
    31 xml_set_element_handler( $parser, "startElement", "endElement" );
    32 xml_set_character_data_handler( $parser, "textData" );
    33 
    34 $f = fopen( 'books.xml', 'r' );
    35 
    36 while( $data = fread( $f, 4096 ) )
    37 {
    38 xml_parse( $parser, $data );
    39 }
    40 
    41 xml_parser_free( $parser );
    42 
    43 foreach( $g_books as $book )
    44 {
    45 echo $book['TITLE']." - ".$book['AUTHOR']." - ";
    46 echo $book['PUBLISHER']." ";
    47 }
    48 ?>
    复制代码

    3.用正则表达式解析 XML

    复制代码
    代码
     1 <?php
     2 $xml = "";
     3 $f = fopen( 'books.xml', 'r' );
     4 while( $data = fread( $f, 4096 ) ) {
     5     $xml .= $data; 
     6 }
     7 fclose( $f );
     8 
     9 preg_match_all( "/<book>(.*?)</book>/s", $xml, $bookblocks );
    10 
    11 foreach( $bookblocks[1] as $block )
    12 {
    13 preg_match_all( "/<author>(.*?)</author>/", $block, $author );
    14 preg_match_all( "/<title>(.*?)</title>/",   $block, $title );
    15 preg_match_all( "/<publisher>(.*?)</publisher>/", $block, $publisher );
    16 echo( $title[1][0]." - ".$author[1][0]." - ".$publisher[1][0]." " );
    17 }
    18 ?>
    复制代码

    4.解析XML到数 组

    复制代码
    代码
     1 <?php
     2     $data = "<root><line /><content language="gb2312">简单的XML数据</content></root>";
     3     $parser = xml_parser_create();                        //创建解析器
     4     xml_parse_into_struct($parser, $data, $values, $index);    //解析到数组
     5     xml_parser_free($parser);                            //释放资源
     6     
     7     //显示数组结构
     8     echo " 索引数组 ";
     9     print_r($index);
    10     echo " 数据数组 ";
    11     print_r($values);
    12 ?>
    复制代码

    5.检查XML是否有效

    复制代码
    代码
     1 <?php
     2     //创建XML解析器
     3     $xml_parser = xml_parser_create();
     4 
     5     //使用大小写折叠来保证能在元素数组中找到这些元素名称
     6     xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
     7 
     8     //读取XML文件
     9     $xmlfile = "bb.xml";
    10     if (!($fp = fopen($xmlfile, "r")))
    11     {
    12         die("无法读取XML文件$xmlfile");
    13     }
    14 
    15     //解析XML文件
    16     $has_error = false;            //标志位
    17     while ($data = fread($fp, 4096))
    18     {
    19         //循环地读入XML文档,只到文档的EOF,同时停止解析
    20         if (!xml_parse($xml_parser, $data, feof($fp)))
    21         {
    22             $has_error = true;
    23             break;
    24         }
    25     }
    26 
    27     if($has_error)
    28     { 
    29         echo "该XML文档是错误的!<br />";
    30 
    31         //输出错误行,列及其错误信息
    32         $error_line   = xml_get_current_line_number($xml_parser);
    33         $error_row   = xml_get_current_column_number($xml_parser);
    34         $error_string = xml_error_string(xml_get_error_code($xml_parser));
    35 
    36         $message = sprintf("[第%d行,%d列]:%s", 
    37                         $error_line,
    38                         $error_row,
    39                         $error_string);
    40         echo $message;
    41     }
    42     else
    43     {
    44         echo "该XML文档是结构良好的。";
    45     }
    46     
    47     //关闭XML解析器指针,释放资源
    48     xml_parser_free($xml_parser);
    49 ?>
    复制代码

    6.可用于精确的读取XML
    test.xml

    复制代码
    代码
     1 <?xml version="1.0" encoding="UTF-8" ?>
     2     <SBMP_MO_MESSAGE>
     3         <CONNECT_ID>100</CONNECT_ID>
     4         <MO_MESSAGE_ID>123456</MO_MESSAGE_ID>
     5         <RECEIVE_DATE>20040605</RECEIVE_DATE>
     6         <RECEIVE_TIME>153020</RECEIVE_TIME>
     7         <GATEWAY_ID>1</GATEWAY_ID>
     8         <VALID>1</VALID>
     9         <CITY_CODE>010</CITY_CODE>
    10         <CITY_NAME>北京</CITY_NAME>
    11         <STATE_CODE>010</STATE_CODE>
    12         <STATE_NAME>北京</STATE_NAME>
    13         <TP_PID>0</TP_PID>
    14         <TP_UDHI>0</TP_UDHI>
    15         <MSISDN>15933626501</MSISDN>
    16         <MESSAGE_TYPE>8</MESSAGE_TYPE>
    17         <MESSAGE>5618常年供应苗木,品种有玉兰、黄叶杨等。联系人:张三,电话:1234567890。</MESSAGE>
    18         <LONG_CODE>100</LONG_CODE>
    19         <SERVICE_CODE>9588</SERVICE_CODE>
    20     </SBMP_MO_MESSAGE>
    21 test.php:
    22 <?php
    23 $myData = array();
    24 $file = file_get_contents("test.xml");
    25 if(strpos($file, '<?xml') > -1) {
    26         try {
    27             //加载解析xml
    28             $xml = simplexml_load_string($file);
    29             if($xml) {
    30                 //echo $this->result;
    31                 //获取节点值
    32                 $CONNECT_ID = $xml->CONNECT_ID;
    33                 $MO_MESSAGE_ID = $xml->MO_MESSAGE_ID;
    34                 $RECEIVE_DATE = $xml->RECEIVE_DATE;
    35                 $RECEIVE_TIME = $xml->RECEIVE_TIME;
    36                 $GATEWAY_ID = $xml->GATEWAY_ID;
    37                 $VALID = $xml->VALID;
    38                 $CITY_CODE = $xml->CITY_CODE;
    39                 $CITY_NAME = $xml->CITY_NAME;
    40                 $STATE_CODE = $xml->CITY_CODE;
    41                 $STATE_NAME = $xml->STATE_NAME;
    42                 $TP_PID = $xml->TP_PID;
    43                 $TP_UDHI = $xml->TP_UDHI;
    44                 $MSISDN = $xml->MSISDN;
    45                 $MESSAGE_TYPE = $xml->MESSAGE_TYPE;
    46                 $MESSAGE = $xml->MESSAGE;//短信
    47                 $LONG_CODE = $xml->LONG_CODE;
    48                 $SERVICE_CODE = $xml->SERVICE_CODE;
    49                 preg_match("/(561)d{1,2}/", $MESSAGE, $code);
    50                 switch($code[0]) {
    51                     case 5618 :
    52                         $myData[message] = $MESSAGE;
    53                         break;
    54                     default :
    55                         $myData[] = '没有短消息。';
    56                         break;
    57                     }
    58                     
    59                 } else {
    60                     echo "加载xml文件错误。";
    61                 }
    62             
    63         } catch(exception $e){
    64             print_r($e);
    65         }
    66 
    67 } else {
    68     echo "没有该XML文件。";
    69 }
    70 
    71 echo "<pre>";
    72 print_r($myData);
    73 echo "<hr>";
    74 echo $myData[message];
    75 ?>
    复制代码
  • 相关阅读:
    git rebase 的使用
    一分钟带你学会利用mybatis-generator自动生成代码!
    手把手带你实战下Spring的七种事务传播行为
    SpringBoot系列-整合Mybatis(注解方式)
    SpringBoot系列-整合Mybatis(XML配置方式)
    Java中打印日志,这4点很重要!
    SpringBoot集成JWT实现权限认证
    一分钟带你了解JWT认证!
    利用SpringBoot+Logback手写一个简单的链路追踪
    SpringBoot中如何优雅的读取yml配置文件?
  • 原文地址:https://www.cnblogs.com/bojuetech/p/4894064.html
Copyright © 2020-2023  润新知