PHP读取XML

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\n"; 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‘]."\n"; 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]."\n" ); 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 "\n索引数组\n";  9     print_r($index); 10     echo "\n数据数组\n"; 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 ?>

时间: 2024-08-08 01:27:51

PHP读取XML的相关文章

android XMLPullParser读取xml文件

由于刚学Android,用的开发工具是Android studio,没用过eclipse的那个开发Android,所以针对有些说由于2个IDE的路径不通导致的文件读取不到,不做分析(实际上是没法分析eclipse里的),这个博文只针对AS用户. 我们的资源文件,除了放到res目录下之外,还可以放在跟java .res同级的asserts(新建的)目录里. 今天要解析的这个xml就是在这个目录下的. 首先说一下xmlpullparser,这个pull解析是基于事件的模式.比如 读取到xml的开始声

C#读取XML文件的基类实现

刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node.Attribute(name)方法,因此,想到结合之前所做的XML操作,完成了一个能够读取XML文件的基类,便于以后的使用. PS:即使再老套的代码,目前也不敢进行优化,一是水平不行,二是不敢. 使用静态扩展类,扩展了几个经常使用的类型,能够方便数据的读写. 操作XML的类,可以直接继承BaseL

【XML配置文件读取】使用jdom读取XML配置文件信息

在项目中我们经常需要将配置信息写在配置文件中,而XML配置文件是常用的格式. 下面将介绍如何通过jdom来读取xml配置文件信息. 配置文件信息 <?xml version="1.0" encoding="UTF-8"?> <config> <base-config> <stringValue>Hello world</stringValue> <integerValue>8</integ

C#中使用XML指南之读取XML

? C#中使用XML指南之读取XML ? 访问的两种模型: ? 在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询,但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题.流模型很好的解决了这个问题,因为它对XML文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文

用C#读取XML文档

本文将以一个非常简单的例子来说明如何使用C#访问一个XML文件并且读取其中的信息.例子本身并无任何实际意义,它只是简单的介绍了如何调用微软的XML标准以及如何运用到实际当中去.希望能够对初次接触C#或者未尝试过通过C#读取XML文件的读者有所启发.本文旨在抛砖引玉,希望能与更多的朋友交流和分享经验.    制作过程 1. 运行Visual Studio.NET,新建Visual C#.NET工程,这里取名为ReadXML. 2. 在解决方案资源管理器中,将Form1.cs改名为frmAuthor

读取xml并将节点保存到Excal

using NPOI.HPSF; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using Sy

Excel开发学习笔记:读取xml文件及csv文件

读取xml文件 有好多种读取xml的方式,xmlDOM比较常见,我使用了另外一种,它以数据流的方式打开文件并读取内容 Imports System.Xml  Dim group As New List(Of String)  Using reader As XmlReader = XmlReader.Create(OpenFileDialog2.FileName)      While reader.ReadToFollowing("group")          reader.Mo

C# 递归读取XML菜单数据

在博客园注册了有4年了,很遗憾至今仍未发表过博客,趁周末有空发表第一篇博客.小生不才,在此献丑了! 最近在研究一些关于C#的一些技术,纵观之前的开发项目的经验,做系统时显示系统菜单的功能总是喜欢把数据写在数据库表,然后直接读取加载到菜单树上显示. 现在想把菜单数据都放在XML里,然后递归读取XML. 由于项目使用WCF,实体类使用了两个,一个是业务逻辑层中的实体,一个是调用业务逻辑层递归方法后进行数据实体的转换,XML读取方法写在业务逻辑层中. 思路:1.先读取XML里所有的菜单    2.根据

android 读取xml

在有些应用中,有一点小数据,直接存储在XML就是,实现较为简单, 1.xml文件放入asset文件夹,结构如: <?xml version="1.0" encoding="UTF-8" ?> <messages><message id="1"><title>3月毕业证数码像采集</title><date1>3</date1><content>3月12日

读取XML文件的指定节点的值 并转换为Item

cmb_State_Send.ItemsSource = null; XmlDocument doc = new XmlDocument(); doc.Load("D:\\模板\\WorkstationState_Config.xml"); //加载Xml文件 XmlElement rootElem = doc.DocumentElement; //获取根节点 XmlNode xn = rootElem.SelectSingleNode("//Workstation[@Nam