热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP读取XML-PHP源码

PHP读取XML
php读取xml

1.php代码

books.xml文件:
 


Jack Herrington

O'Reilly


Jack Herrington

O'Reilly


 
1.DOMDocument方法
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 "
"; } ?> 2.用 SAX 解析器读取 XML 3.用正则表达式解析 XML (.*?)\<\/book\>/s", $xml, $bookblocks ); foreach( $bookblocks[1] as $block ) { preg_match_all( "/\(.*?)\<\/author\>/", $block, $author ); preg_match_all( "/\ content1 2009-10-11 content2 2009-11-11 【直接生成字符串】 方法1:使用纯粹的PHP代码生成字符串,并把这个字符串写入一个以XML为后缀的文件。这是最原始的生成XML的方法,不过有效! PHP代码如下: &#39;title1&#39;, &#39;content&#39; => &#39;content1&#39;, &#39;pubdate&#39; => &#39;2009-10-11&#39;, ), array( &#39;title&#39; => &#39;title2&#39;, &#39;content&#39; => &#39;content2&#39;, &#39;pubdate&#39; => &#39;2009-11-11&#39;, ) ); $title_size = 1; $xml = "\n"; $xml .= "
\n"; foreach ($data_array as $data) { $xml .= create_item($data[&#39;title&#39;], $title_size, $data[&#39;content&#39;], $data[&#39;pubdate&#39;]); } $xml .= "
\n"; echo $xml; // 创建XML单项 function create_item($title_data, $title_size, $content_data, $pubdate_data) { $item = "\n"; $item .= "\n"; $item .= "" . $content_data . "\n"; $item .= " " . $pubdate_data . "\n"; $item .= "\n"; return $item; } ?> 【DomDocument】 方法2:使用DomDocument生成XML文件 创建节点使用createElement方法, 创建文本内容使用createTextNode方法, 添加子节点使用appendChild方法, 创建属性使用createAttribute方法 PHP代码如下: &#39;title1&#39;, &#39;content&#39; => &#39;content1&#39;, &#39;pubdate&#39; => &#39;2009-10-11&#39;, ), array( &#39;title&#39; => &#39;title2&#39;, &#39;content&#39; => &#39;content2&#39;, &#39;pubdate&#39; => &#39;2009-11-11&#39;, ) ); // 属性数组 $attribute_array = array( &#39;title&#39; => array( &#39;size&#39; => 1 ) ); // 创建一个XML文档并设置XML版本和编码。。 $dom=new DomDocument(&#39;1.0&#39;, &#39;utf-8&#39;); // 创建根节点 $article = $dom->createElement(&#39;article&#39;); $dom->appendchild($article); foreach ($data_array as $data) { $item = $dom->createElement(&#39;item&#39;); $article->appendchild($item); create_item($dom, $item, $data, $attribute_array); } echo $dom->saveXML(); function create_item($dom, $item, $data, $attribute) { if (is_array($data)) { foreach ($data as $key => $val) { // 创建元素 $$key = $dom->createElement($key); $item->appendchild($$key); // 创建元素值 $text = $dom->createTextNode($val); $$key->appendchild($text); if (isset($attribute[$key])) { // 如果此字段存在相关属性需要设置 foreach ($attribute[$key] as $akey => $row) { // 创建属性节点 $$akey = $dom->createAttribute($akey); $$key->appendchild($$akey); // 创建属性值节点 $aval = $dom->createTextNode($row); $$akey->appendChild($aval); } } // end if } } // end if } // end function ?> 【XMLWriter】 方法3:使用XMLWriter类创建XML文件 此方法在PHP 5.1.2后有效 另外,它可以输出多种编码的XML,但是输入只能是utf-8 PHP代码如下: &#39;title1&#39;, &#39;content&#39; => &#39;content1&#39;, &#39;pubdate&#39; => &#39;2009-10-11&#39;, ), array( &#39;title&#39; => &#39;title2&#39;, &#39;content&#39; => &#39;content2&#39;, &#39;pubdate&#39; => &#39;2009-11-11&#39;, ) ); // 属性数组 $attribute_array = array( &#39;title&#39; => array( &#39;size&#39; => 1 ) ); $xml = new XMLWriter(); $xml->openUri("php://output"); // 输出方式,也可以设置为某个xml文件地址,直接输出成文件 $xml->setIndentString(&#39; &#39;); $xml->setIndent(true); $xml->startDocument(&#39;1.0&#39;, &#39;utf-8&#39;); // 开始创建文件 // 根结点 $xml->startElement(&#39;article&#39;); foreach ($data_array as $data) { $xml->startElement(&#39;item&#39;); if (is_array($data)) { foreach ($data as $key => $row) { $xml->startElement($key); if (isset($attribute_array[$key]) && is_array($attribute_array[$key])) { foreach ($attribute_array[$key] as $akey => $aval) { // 设置属性值 $xml->writeAttribute($akey, $aval); } } $xml->text($row); // 设置内容 $xml->endElement(); // $key } } $xml->endElement(); // item } $xml->endElement(); // article $xml->endDocument(); $xml->flush(); ?> 【SimpleXML】 方法4:使用SimpleXML创建XML文档 &#39;title1&#39;, &#39;content&#39; => &#39;content1&#39;, &#39;pubdate&#39; => &#39;2009-10-11&#39;, ), array( &#39;title&#39; => &#39;title2&#39;, &#39;content&#39; => &#39;content2&#39;, &#39;pubdate&#39; => &#39;2009-11-11&#39;, ) ); // 属性数组 $attribute_array = array( &#39;title&#39; => array( &#39;size&#39; => 1 ) ); $string = <<
XML; $xml = simplexml_load_string($string); foreach ($data_array as $data) { $item = $xml->addChild(&#39;item&#39;); if (is_array($data)) { foreach ($data as $key => $row) { $node = $item->addChild($key, $row); if (isset($attribute_array[$key]) && is_array($attribute_array[$key])) { foreach ($attribute_array[$key] as $akey => $aval) { // 设置属性值 $node->addAttribute($akey, $aval); } } } } } echo $xml->asXML(); ?>

3.PHP中的XML解析的5种方法

【使用DomDocument解析】
load($url);
 */
  
$elements = $dom->getElementsByTagName("current_conditions");
$element = $elements->item(0);
$cOndition= get_google_xml_data($element, "condition");
$temp_c = get_google_xml_data($element, "temp_c");
echo &#39;天气:&#39;, $condition, &#39;
&#39;; echo &#39;温度:&#39;, $temp_c, &#39;
&#39;; function get_utf8_string($content) { // 将一些字符转化成utf8格式 $encoding = mb_detect_encoding($content, array(&#39;ASCII&#39;,&#39;UTF-8&#39;,&#39;GB2312&#39;,&#39;GBK&#39;,&#39;BIG5&#39;)); return mb_convert_encoding($content, &#39;utf-8&#39;, $encoding); } function get_google_xml_data($element, $tagname) { $tags = $element->getElementsByTagName($tagname); // 取得所有的$tagname $tag = $tags->item(0); // 获取第一个以$tagname命名的标签 if ($tag->hasAttributes()) { // 获取data属性 $attribute = $tag->getAttribute("data"); return $attribute; }else { return false; } } ?> 这只是一个简单的示例,仅包括了loadXML, item, getAttribute,getElementsByTagName等方法,还有一些有用的方法,这个依据你的实际需要。 【XMLReader】 当我们要用php解读xml的内容时,有很多物件提供函式,让我们不用一个一个字元去解析,而只要根据标签和属性名称,就能取出文件中的属性与内容了,相较之下方便许多。其中XMLReader循序地浏览过xml档案的节点,可以想像成游标走过整份文件的节点,并抓取需要的内容。 open($url); $cOndition= &#39;&#39;; $temp_c = &#39;&#39;; while ($xml->read()) { // echo $xml->name, "==>", $xml->depth, "
"; if (!empty($condition) && !empty($temp_c)) { break; } if ($xml->name == &#39;condition&#39; && empty($condition)) { // 取第一个condition $cOndition= $xml->getAttribute(&#39;data&#39;); } if ($xml->name == &#39;temp_c&#39; && empty($temp_c)) { // 取第一个temp_c $temp_c = $xml->getAttribute(&#39;data&#39;); } $xml->read(); } $xml->close(); echo &#39;天气:&#39;, $condition, &#39;
&#39;; echo &#39;温度:&#39;, $temp_c, &#39;
&#39;; 我们只是需要取第一个condition和第一个temp_c,于是遍历所有的节点,将遇到的第一个condition和第一个temp_c写入变量,最后输出。 【DOMXPath】 这种方法需要使用DOMDocument对象创建整个文档的结构, load($url); $xpath = new DOMXPath($dom); $element = $xpath->query("/xml_api_reply/weather/current_conditions")->item(0); $cOndition= get_google_xml_data($element, "condition"); $temp_c = get_google_xml_data($element, "temp_c"); echo &#39;天气:&#39;, $condition, &#39;
&#39;; echo &#39;温度:&#39;, $temp_c, &#39;
&#39;; function get_google_xml_data($element, $tagname) { $tags = $element->getElementsByTagName($tagname); // 取得所有的$tagname $tag = $tags->item(0); // 获取第一个以$tagname命名的标签 if ($tag->hasAttributes()) { // 获取data属性 $attribute = $tag->getAttribute("data"); return $attribute; }else { return false; } } ?> 【xml_parse_into_struct】 说明:int xml_parse_into_struct ( resource parser, string data, array &values [, array &index] ) 该函数将 XML 文件解析到两个对应的数组中,index 参数含有指向 values 数组中对应值的指针。最后两个数组参数可由指针传递给函数。 注意: xml_parse_into_struct() 失败返回 0,成功返回 1。这和 FALSE 与 TRUE 不同,使用例如 === 的运算符时要注意。 &#39;; echo &#39;温度:&#39;, $vals[$index[&#39;TEMP_C&#39;][0]][&#39;attributes&#39;][&#39;DATA&#39;], &#39;
&#39;; 【Simplexml】 此方法在PHP5中可用 这个在google的官方文档中有相关的例子,如下: // Charset: utf-8 /** * 用php Simplexml 调用google天气预报api,和g官方的例子不一样 * google 官方php domxml 获取google天气预报的例子 * http://www.google.com/tools/toolbar/buttons/intl/zh-CN/apis/howto_guide.html * * @copyright Copyright (c) 2008 * @license New BSD License * @version 2008-11-9 */ // 城市,用城市拼音 $city = empty($_GET[&#39;city&#39;]) ? &#39;shenzhen&#39; : $_GET[&#39;city&#39;]; $cOntent= file_get_contents("http://www.google.com/ig/api?weather=$city&hl=zh-cn"); $content || die("No such city&#39;s data"); $cOntent= mb_convert_encoding($content, &#39;UTF-8&#39;, &#39;GBK&#39;); $xml = simplexml_load_string($content); $date = $xml->weather->forecast_information->forecast_date->attributes(); $html = $date. "
\r\n"; $current = $xml->weather->current_conditions; $cOndition= $current->condition->attributes(); $temp_c = $current->temp_c->attributes(); $humidity = $current->humidity->attributes(); $icon = $current->icon->attributes(); $wind = $current->wind_condition->attributes(); $condition && $cOndition= $xml->weather->forecast_conditions->condition->attributes(); $icon && $icon = $xml->weather->forecast_conditions->icon->attributes(); $html.= "当前: {$condition}, {$temp_c}°C, {$humidity} {$wind}
\r\n"; foreach($xml->weather->forecast_conditions as $forecast) { $low = $forecast->low->attributes(); $high = $forecast->high->attributes(); $icon = $forecast->icon->attributes(); $cOndition= $forecast->condition->attributes(); $day_of_week = $forecast->day_of_week->attributes(); $html.= "{$day_of_week} : {$high} / {$low} °C, {$condition}
\r\n"; } header(&#39;Content-type: text/html; Charset: utf-8&#39;); print $html; ?>

推荐阅读
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
author-avatar
王功争_781
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有