PHP读取XML格式文件的方法总结


Posted in PHP onFebruary 27, 2017

本文实例总结了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 相关文章推荐
ionCube 一款类似zend的PHP加密/解密工具
Jul 25 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
Aug 01 PHP
php 保留字列表
Oct 04 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
Aug 21 PHP
php连接oracle数据库及查询数据的方法
Dec 29 PHP
浅谈PHP中output_buffering
Jul 13 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
May 19 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
Django中的cookie与session操作实例代码
Aug 17 PHP
Yii2.0框架behaviors方法使用实例分析
Sep 30 PHP
Laravel 创建指定表 migrate的例子
Oct 09 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
Oct 15 PHP
PHP批量修改文件名称的方法分析
Feb 27 #PHP
php基于PDO实现功能强大的MYSQL封装类实例
Feb 27 #PHP
php实现通过soap调用.Net的WebService asmx文件
Feb 27 #PHP
PHP 中使用ajax时一些常见错误总结整理
Feb 27 #PHP
PHP/HTML混写的四种方式总结
Feb 27 #PHP
老生常谈文本文件和二进制文件的区别
Feb 27 #PHP
php实现数据库的增删改查
Feb 26 #PHP
You might like
一步一步学习PHP(3) php 函数
2010/02/15 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
php中的登陆login实例代码
2016/06/20 PHP
php实现URL加密解密的方法
2016/11/17 PHP
php判断是否连接上网络的方法实例详解
2016/12/14 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
2016/06/25 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
jQuery插件FusionCharts绘制的3D环饼图效果示例【附demo源码】
2017/04/02 jQuery
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
使用 Python 清理收藏夹里已失效的网站
2019/12/03 Python
pytorch:实现简单的GAN示例(MNIST数据集)
2020/01/10 Python
pytorch模型存储的2种实现方法
2020/02/14 Python
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
财务管理专业应届毕业生求职信
2013/09/22 职场文书
销售经理岗位职责
2014/03/16 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
交通事故委托书范本精选
2014/10/04 职场文书
检讨书怎么写
2015/05/07 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server
Mysql超详细讲解死锁问题的理解
2022/04/01 MySQL
java版 联机五子棋游戏
2022/05/04 Java/Android