PHP SimpleXML
PHP SimpleXML
SimpleXML是什么?
SimpleXML是新的PHP 5 。这是一个简单的方法获得一个要素的属性和文字,如果您知道XML文件的布局。
相比到DOM或外籍分析器, SimpleXML只需几行代码读取文本数据从一个组成部分。
SimpleXML转换XML文档到一个对象,像这样:
内容-转换为单一属性S impleXMLElement对象。当有一个以上的元素一个层次上,他们放入一个数组
属性-访问使用关联数组,如果指数对应的属性名称
元数据-数据从文本的内容转换为字符串。如果一个要素有一个以上的文本节点,他们将被安排在该命令他们发现
SimpleXML速度快,易于使用的表演时,基本任务包括:
读XML文件
提取数据从XML字符串
编辑文本节点或属性
然而,当先进的处理XML的,如名称,你是最好的外籍人士使用分析器或XML的DOM 。
安装
从PHP 5.0 , SimpleXML职能是PHP核心的一部分。没有安装即可使用这些功能。
用SimpleXML
下面是一个XML文件:
<?xml version="1.0" encoding="ISO-8859-1"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
我们希望输出的元素名称和数据的XML档案以上。
这是做什么:
加载XML文件
获取的名字的第一个元素
创建一个循环,将触发每个孩子节点,使用儿童( )函数
输出元素的名称和数据,每个子节点
例如
<?php $xml = simplexml_load_file("test.xml");echo $xml->getName() . "<br />";foreach($xml->children() as $child) { echo $child->getName() . ": " . $child . "<br />"; } ?>输出结果为note to: Tove from: Jani heading: Reminder body: Don't forget me this weekend!转载请注明来自: www.111cn.net/phper/php.html
PHP XML DOM
内置的DOM解析器可以处理XML文档在PHP 。
这里是什么?
的W3C DOM提供了一套标准的对象为HTML和XML文件,以及一个标准的接口用于访问和操纵它们。
的W3C DOM分为不同部分(核心, XML和HTML )和不同层次( 1/2/3级的DOM ) :
*核心的DOM 定义一套标准的对象结构的任何文件
*的XML的DOM 定义一套标准的对象的X ML文件
*的HTML的DOM 定义一套标准的对象为H TML文件
如果您想了解更多有关的XML的DOM ,请访问我们的XML的DOM教程。
XML解析
要阅读和更新创建和操纵一个XM L文件,您需要一个XM L解析器。
有两个基本类型的XML解析器:
树为基础的剖析:这分析器转换XML文件成一个树状结构。分析了整个文件,并提供进入树要素
基于事件的剖析:观XML文件的一系列活动。当某一特定事件发生时,它要求一个函数来处理它
在DOM解析器是一个树为基础的剖析。
看看下面的XML文件部分:
<?xml version="1.0" encoding="ISO88591"?> <from>Jani</from>
The XML DOM sees the XML above as a tree structure:
- Level 1: XML Document
- Level 2: Root element: <from>
- Level 3: Text element: "Jani"
安装
的DOM XML解析器职能是PHP核心的一部分。没有安装即可使用这些功能。
一个XML文件
XML档案下文将用于在我们的例子:
<?xml version="1.0" encoding="ISO88591"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
负载和输出的XML
我们要初始化XML分析器,载入XML和输出:
例如
$xmlDoc = new DOMDocument(); $xmlDoc>load("note.xml"); print $xmlDoc>saveXML(); ?>
输出为.
Tove
Jani Reminder Don't forget me this weekend! 如果您选择“查看源文件”在浏览器窗口中,您会看到下面的HTML :
<?xml version="1.0" encoding="ISO88591"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>上面的例子中创建的DOMDocument对象并加载XML从“ note.xml ”到它。
然后saveXML ( )函数来把内部的XML文件到一个字符串,这样我们就可以打印出来。
通过XML的循环
我们要初始化XML分析器,负载的XML ,并通过回路的所有要素<note>内容:
例如
<?php $xmlDoc = new DOMDocument(); $xmlDoc>load("note.xml");$x = $xmlDoc>documentElement; foreach ($x>childNodes AS $item) { print $item>nodeName . " = " . $item>nodeValue . "<br />"; } ?>结果为.#text = to = Tove #text = from = Jani #text = heading = Reminder #text = body = Don't forget me this weekend! #text =在上面的例子中看到,有空白文本节点之间的每个元素。
当XML的产生,往往含有白色空间之间的节点。对的XML DOM解析器把这些作为普通的内容,如果你不知道,他们有时会造成问题。
转载请注明来自: www.111cn.net/phper/php.html
<?xml version='1.0' encoding='UTF-8'?>
<root>
<key id="5201314" name="望咩掉啊">
<user id='6789' name='不上学了'><![CDATA[我靠!!!@*&^$(*%&]]></key>
<user id="6789" name="不上学了">222</key>
</key>
<key id="5201314" name="望咩掉啊">
<user id='6789' name='不上学了'><![CDATA[我靠!!!|""!@":#$@$]]></key>
<user id="6789" name="不上学了">222</key>
</key>
<key id="5201314" name="望咩掉啊">
<user id='6789' name='不上学了'><![CDATA[我靠!!!<><><><>]]></key>
<user id="6789" name="不上学了">222</key>
</key>
</root>
<?php
/* func.xml.php 2008-09-20 kilobug
必须声明头部属性,xml每个节点的值和属性严禁出现 <、>、" 字符,如需出现,请使用CDATA
每个节点属性必须统一使用单引号'或双引号"
忽略注释,返回一个数组。
*/
$xmlContent = ''; //临时变量
/* 载入xml文件,解析后返回数组 */
function loadXML( $path, $assoc = null, $attrassoc = null ) {
return parseXML( @file_get_contents( $path ), $assoc, $attrassoc );
}
/* 解析XMl内容,返回数组 */
function parseXML( $xmltext, $assoc = null, $attrassoc = null ) {
$xmldata = array();
//转换顶部属性
$noderoot = strpos( $xmltext, '<?' );
$noderootspace = strpos( $xmltext, ' ' );
$nodefoot = strpos( $xmltext, '?>' );
$attr = trim( substr($xmltext, $noderootspace, $nodefoot-$noderoot-5) );
//转换节点
$xmldata = array_merge(
array(
array_merge(
array( substr($xmltext, $noderoot+2, $noderootspace-$noderoot-2) ),
parseXMLAttrs($attr, $attrassoc)
)
),
parseXMLNodes( trim(substr($xmltext, $nodefoot+2)), $assoc, $attrassoc )
);
return $xmldata;
}
/* 解析XML节点,返回数组 */
function parseXMLNodes( $nodestr, $assoc = null, $attrassoc = null ) {
global $xmlContent;
$xmlContent = $nodestr;
if ( empty($xmlContent) || !strstr($xmlContent, '<') ) {
return array();
}
$nodedate = array();
$i = 0;
while ( !empty($xmlContent) ) {
$noderoot = strpos( $xmlContent, '<' );
$nodefoot = strpos( $xmlContent, '>' );
$nodeend = strpos( $xmlContent, '/' );
$cdataroot = strpos( $xmlContent, '<![CDATA[' );
$cdatafoot = strpos( $xmlContent, ']]>' );
if ( $noderoot === $cdataroot ) { //判断是否CDATA
$nodedate = substr($xmlContent, $cdataroot+9, $cdatafoot-$cdataroot-9);
$xmlContent = substr( $xmlContent, strpos($xmlContent, '>', $cdatafoot+3)+1 );
break $nodedate;
} else if ( $noderoot == $nodeend-1 ) { //是否结束节点,是则返回前面的内容
if ( $i == 0 ) {
$nodedate = substr( $xmlContent, 0, $noderoot );
$xmlContent = substr( $xmlContent, $nodefoot+1 );
return $nodedate;
}
else {
$xmlContent = substr( $xmlContent, $nodefoot+1 );
break;
}
}
$nodecompart = strpos( $xmlContent, ' ' );
//判断有无属性
if ( $nodecompart != false && $nodecompart > $noderoot && $nodecompart < $nodefoot ) { //有属性
$nodedate[$i][0] = array_merge( array($assoc ? substr($xmlContent, $noderoot+1, $nodecompart-$noderoot-1) : ''), parseXMLAttrs(substr($xmlContent, $nodecompart+1, $nodefoot-$nodecompart-($nodefoot-1 == $nodeend ? 2 : 1)), $attrassoc) );
} else { //无属性
$nodedate[$i][0] = array( $assoc ? substr($xmlContent, $noderoot+1, $nodefoot-$noderoot-1) : '' );
}
$i++;
$xmlContent = substr( $xmlContent, $nodefoot+1 ); //截取本节点后面内容
if ( $nodefoot-1 == $nodeend ) { //判断是否单节点
$nodedate[$i-1][1] = '';
continue;
} else {
$nodedate[$i-1][1] = parseXMLNodes( $xmlContent, $assoc, $attrassoc );
}
}
return $nodedate;
}
/* 解析XML节点属性,返回数组 */
function parseXMLAttrs( $attrstr, $assoc = null ) {
if ( !$attrstr ) return array();
echo( $attrstr . "n" );
$attrdata = array();
$attrcenter = $attrfoot = 1; //开始转换
$tmpnum = false;
while ( $attrcenter != false ) {
$tmpnum = strpos($attrstr, '='');
$attrcenter = strpos($attrstr, '="');
if ( $tmpnum == false ) {
$attrfoot = strpos($attrstr, '"', $attrcenter+2);
} else {
$attrcenter = $tmpnum;
$attrfoot = strpos($attrstr, ''', $attrcenter+2);
}
if ( $assoc ) { //是否关联数组
$attrdata[substr( $attrstr, 0, $attrcenter)] = substr( $attrstr, $attrcenter+2, $attrfoot-$attrcenter-2 );
} else {
$attrdata[] = substr( $attrstr, $attrcenter+2, $attrfoot-$attrcenter-2 );
}
$attrstr = trim(substr($attrstr, $attrfoot+1));
if ( !$attrstr ) {
break;
}
}
return $attrdata;
}
//解析数组为XML(没写)
function parseArrayToXML( $ary ) {
}
//解析数组为XML的Nodes(没写)
function parseArrayToXMLNodes( $ary ) {
}
/* 测试
$t = microtime();
//loadXML('../books.xml');
print_r( loadXML('../test.xml', 1, 1) ); //自己找一个常见的xml文档
echo microtime() - $t;
*/
?>
php读了xml很方便的,我们下面用dom与php自带的xml_parser来实例吧,我们先看看wk.xml 文件, 其实这里是blogbus的rss文件哦,
<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title>mikeowen</title>
<link>http://mikeowen.blogbus.com</link>
<description><![CDATA[Design]]></description>
<generator> by blogbus.com </generator>
<lastBuildDate>Tue, 30 Jan 2007 13:46:52 +0800</lastBuildDate>
<image>
<url>http://public.blogbus.com/images/head.gif</url>
<title>mikeowen</title>
<link>http://mikeowen.blogbus.com</link>
</image>
<item>
<title>vanke</title>
<description>tff</description>
<link>http://mikeowen.blogbus.com/logs/28560579.html</link>
<author>mikeowen</author>
<pubDate>Fri, 05 Sep 2008 12:41:22 +0800</pubDate>
</item>
<item>
<title>something3</title>
<description>eee</description>
<link>http://mikeowen.blogbus.com/logs/23972142.html</link>
<author>mikeowen</author>
<pubDate>Wed, 02 Jul 2008 12:26:40 +0800</pubDate>
</item>
</channel>
</rss>
这是我一个同事的博客rss文件我取下来作实例了吧.下面我们来看看解析xml 的方法用dom来做,
<?php
$doc = new DOMDocument();
$doc->load( 'wk.xml' );
$books = $doc->getElementsByTagName( "item" );
foreach( $books as $book )
{
$authors = $book->getElementsByTagName( "title" );
$author = $authors->item(0)->nodeValue;
$publishers = $book->getElementsByTagName( "link" );
$publisher = $publishers->item(0)->nodeValue;
$titles = $book->getElementsByTagName( "pubDate" );
$title = $titles->item(0)->nodeValue;
echo "$title - $author - $publishern";
}
?>
简单吧,直接读取节点然后再取当前第一个节点的值就行了.好了下面我们再看第种方法用php 自然的.
<?php
$g_books = array();
$g_elem = null;
function startElement( $parser, $name, $attrs )
{
global $g_books, $g_elem;
if ( $name == 'item' ) $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 == 'link' ||
$g_elem == 'pubDate' ||
$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( 'wk.xml', 'r' );
while( $data = fread( $f, 4096 ) )
{
xml_parse( $parser, $data );
}
xml_parser_free( $parser );
foreach( $g_books as $book )
{
echo $book['title']." - ".$book['link']." - ";
echo $book['pubDate']."n";
}
?>
这种代码多一点,单效率要比上面那个高很多的.
MXML是一个可以让你在Adobe Flex中布局用户界面组件的一种XML语言。你也可以使用MXML声明来定义程序中的非可视化组件。安装好FLEX Development 后,你就可以轻松的结合PHP完成一个FLASH曲线图。
先从PHP入手:
FLEX 和PHP的交互最常用的就是
和XML的交互,就是用PHP生成XML,然后用FLEX去读取并且显示。
我们以XML的形式先写一个帐目详单的数据。
代码:
header("Content-Type: text/xml");
$arr = array(
array('day'=>'01','sum'=>'153.1'),
array('day'=>'02','sum'=>'882.86'),
array('day'=>'03','sum'=>'456.9'),
array('day'=>'04','sum'=>'717.7'),
array('day'=>'05','sum'=>'255.1'),
array('day'=>'06','sum'=>'533.1')
);
$xml_return .= "<bills>";
foreach ( $arr as $use){
$xml_return .="<bill><sum>{$use['sum']}</sum><name>{$use['day']}</name></bill> ";
}
$xml_return.= "</bills>";
echo $xml_return;
显示6个月的消费记录,$arr也可以是从数据库读出来的数据,这里只是作为一个例子,所以直接给一个数组赋值。
- <bills>
- <bill>
<sum>153.1</sum>
<name>01</name>
</bill>
- <bill>
<sum>882.86</sum>
<name>02</name>
</bill>
- <bill>
<sum>456.9</sum>
<name>03</name>
</bill>
- <bill>
<sum>717.7</sum>
<name>04</name>
</bill>
- <bill>
<sum>255.1</sum>
<name>05</name>
</bill>
- <bill>
<sum>533.1</sum>
<name>06</name>
</bill>
</bills>
Php部分就完成了 接下来是写MXML:
代码:
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="getaccount()">
<mx:HTTPService id="listRequest" url="" useProxy="false" method="POST">
<mx:request xmlns=""> </mx:request>
</mx:HTTPService>
<mx:Script><![CDATA[
import mx.rpc.events.ResultEvent;//引用ResultEvent类
public function getaccount():void{
listRequest.url='http://localhost/arr.php';
listRequest.send();
}
]]></mx:Script>
<mx:LineChart showDataTips="true" clipContent="false" x="126" y="10" id="tongjitu" dataProvider="{listRequest.lastResult.bills.bill}" width="678">
<mx:horizontalAxis>
<mx:CategoryAxis dataProvider="{listRequest.lastResult.bills.bill}" categoryField="name" title="(日)" />
</mx:horizontalAxis>
<mx:series>
<mx:LineSeries displayName="每日消费" yField="sum" xField="name"/>
</mx:series>
</mx:LineChart>
</mx:Application>
逐一解释一下
代码:
Application //MXML应用程序开头
代码:
creationComplete="getaccount()" //代表页面加载完成后 执行 getaccount函数
代码:
〈mx:HTTPService id="listRequest" url="" useProxy="false" method="POST"〉
〈mx:request xmlns=""〉 〈/mx:request〉
〈/mx:HTTPService〉
//则是一个HTTP的请求,发送POST到一个PHP文件 去获取数据
代码:
mx:Script //MXML里面的脚本 都用 <mx:Script>包含进去
下面分析下getaccount函数:
代码:
public function getaccount():void{
listRequest.url='http://localhost/arr.php';
listRequest.send();
}
//列出了 HTTPService 请求地址是 http://localhost/arr.php
//你同样也可以写成相对路径 比如 listRequest.url='./arr.php';
代码:
mx:LineChart //是一个 曲线 组件,我们可以直接拿来使用
代码:
dataProvider :数据源:listRequest.lastResult.bills.bill
bills.bill 是XML里面的标签
代码:
mx:LineSeries displayName="每日消费" yField="sum" xField="name"
//则定义了 横纵坐标的值。
//Sum name 就是XML里面的数据的标签
相关文章
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
这篇文章主要介绍了基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23- 这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
- PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
- index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04- 这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
- 这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
- 这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31- 这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
- 今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
- 这篇文章主要介绍了golang与php实现计算两个经纬度之间距离的方法,结合实例形式对比分析了Go语言与php进行经纬度计算的相关数学运算技巧,需要的朋友可以参考下...2016-07-29
- 这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06
- 经常看到有人踩在了PHP路径的坑上面了,感觉有必要来说说PHP中相对路径的一些坑,以及PHP中绝对路径的使用,下面一起来看看。 ...2016-08-24
- 这篇文章主要为大家详细介绍了php构造方法中析构方法在继承中的表现,感兴趣的小伙伴们可以参考一下...2016-04-15
- 这篇文章主要介绍了thinkPHP中多维数组的遍历方法,以简单实例形式分析了thinkPHP中foreach语句的使用技巧,需要的朋友可以参考下...2016-01-12
- 这篇文章主要介绍了PHP如何使用cURL实现Get和Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-11
- 这篇文章主要为大家详细介绍了php图片添加文字水印实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-03-17
- 这篇文章主要介绍了php有序列表或数组中删除指定的值的实现代码,删除给定的值之后,得到一个新的有序列表,长度-1,下面是具体的实现方法...2021-08-22
- 这篇文章主要介绍了PHP简单实现生成txt文件到指定目录的方法,简单对比分析了PHP中fwrite及file_put_contents等函数的使用方法,需要的朋友可以参考下...2016-04-28