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里面的数据的标签
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";
}
?>
这种代码多一点,单效率要比上面那个高很多的.
<?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 - $publishern";
}
?>
读取xml文件,php 读取html文件,如何读取xml文件
$obj = new JZH_xml("<STRING>asdfasdf</STRING>");
$obj->setChar('gb2312');
$obj->getElementByTagname('string',0)->value;
$obj->getstring(0)->value;
...
/*
轻便的xml文档操作
setChar 编码转换
parse 解析xml文档
parse_file 从文件解析xml文档
getElementByTagname 获得tag对象
get<tag> 获得tag对象
*/
class JZH_xml{
var $index;
var $vals;
var $in='utf-8';
var $out='utf-8';
var $xmlobj;
function JZH_xml($data=false,$in=false,$out=false){
$this->xmlobj = xml_parser_create();
if($data){
xml_parse_into_struct($this->xmlobj, $data, $this->vals, $this->index);
xml_parser_free($this->xmlobj);
}
}
function setChar($out=false,$in=false){
if($in)$this->in=$in;
if($out)$this->out=$out;
array_walk_recursive($this->vals,array($this,'iconv'));
}
function iconv(&$value, $key){
$value=iconv($this->in,$this->out,$value);
}
function parse($data){
xml_parse_into_struct($this->xmlobj, $data, $this->vals, $this->index);
xml_parser_free($this->xmlobj);
}
function parse_file($file){
$data = file_get_contents($file);
$this->parse($data);
}
function getElementByTagname($tag,$index){
$tag = strtoupper($tag);
if(!isset($this->index[$tag][$index]))return false;
$index = $this->index[$tag][$index];
return (object)$this->vals[$index];
}
function __call($name,$arguments){
if(($tag=str_replace('GET','',strtoupper($name)))==strtoupper($name))return false;
return $this->getElementByTagname($tag,$arguments[0]);
}
}
代码如下 | 复制代码 |
<?php |