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 相关文章推荐
php adodb分页实现代码
Mar 19 PHP
php计算整个目录大小的方法
Jun 01 PHP
隐性调用php程序的方法
Jun 13 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
Nov 27 PHP
使用Composer安装Yii框架的方法
Mar 15 PHP
PHP获取网站中各文章的第一张图片的代码示例
May 20 PHP
php使用curl详细解析及问题汇总
Aug 11 PHP
CI框架常用函数封装实例
Nov 21 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
Aug 01 PHP
php实现的AES加密类定义与用法示例
Jan 29 PHP
php实例化一个类的具体方法
Sep 19 PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 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 和 MySQL 基础教程(二)
2006/10/09 PHP
php $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
2010/06/21 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
php json_encode值中大括号与花括号区别
2013/09/30 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
根据分辩率调用不同的CSS.
2007/01/08 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
2019/12/17 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
Python常用模块用法分析
2014/09/08 Python
Python表示矩阵的方法分析
2017/05/26 Python
关于Python中浮点数精度处理的技巧总结
2017/08/10 Python
Python3实现抓取javascript动态生成的html网页功能示例
2017/08/22 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
多个版本的python共存时使用pip的正确做法
2020/10/26 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
详解HTML5表单新增属性
2016/12/21 HTML / CSS
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
启动一个线程是用run()还是start()
2016/12/25 面试题
医院实习接收函
2014/01/12 职场文书
yy生日主持词
2014/03/20 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
课题研究阶段性总结
2015/08/13 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书