在与其他系统进行WEBSERVICE对接的时候发现,PHP无法识别.NET下的时间参数。
分析:
PHP中的调用WEBSERVICE代码是手工编写xml格式的数据包来实现的,并不像我们.NET 和 JAVA中一样可以利用工具来生成代理类.
所以导致了,PHP在与其他系统语言对接的时候需要处理,不同编程语言直接的兼容问题..NET中的时间类型就是一个例子.
解决:
经过分析,既然,PHP是以纯XML的格式的数据包来进行调用,那么,按照.NET的时间格式,传递完全一样格式的时间字符串来替代时间参数,是否可以让.NET识别?
经过验证,这种做法可行.必须传递类似的字符串作为时间格式,.NET才能识别。
<timeBill>2010-04-20T17:46:28.609375+08:00</timeBill>
php读取xml的类,有需要的朋友,可以参考下。
<?php
#------------------------------------------
#
# XML Library, by Keith Devens, version 1.2b
# <a href="http://keithdevens.com/software/phpxml" target="_blank">http://keithdevens.com/software/phpxml</a>
#
# This code is Open Source, released under terms similar to the Artistic License.
# Read the license at <a href="http://keithdevens.com/software/license" target="_blank">http://keithdevens.com/software/license</a>
#
#------------------------------------------
# XML_unserialize: takes raw XML as a parameter (a string)
# and returns an equivalent PHP data structure
#------------------------------------------
function & XML_unserialize(&$xml){
$xml_parser = &new XML();
$data = &$xml_parser->parse($xml);
$xml_parser->destruct();
return $data;
}
-----------------------#####
# XML_serialize: serializes any PHP data structure into XML
# Takes one parameter: the data to serialize. Must be an array.
-----------------------#
function & XML_serialize(&$data, $level = 0, $prior_key = NULL){
if($level == 0){ ob_start(); echo '<?xml version="1.0" ?>',"\n"; }
while(list($key, $value) = each($data))
if(!strpos($key, ' attr')) #if it's not an attribute
#we don't treat attributes by themselves, so for an empty element
# that has attributes you still need to set the element to NULL
if(is_array($value) and array_key_exists(0, $value)){
XML_serialize($value, $level, $key);
}else{
$tag = $prior_key ? $prior_key : $key;
echo str_repeat("\t", $level),'<',$tag;
if(array_key_exists("$key attr", $data)){ #if there's an attribute for this element
while(list($attr_name, $attr_value) = each($data["$key attr"]))
echo ' ',$attr_name,'="',htmlspecialchars()($attr_value),'"';
reset($data["$key attr"]);
}
if(is_null($value)) echo " />\n";
elseif(!is_array($value)) echo '>',htmlspecialchars($value),"</$tag>\n";
else echo ">\n",XML_serialize($value, $level+1),str_repeat("\t", $level),"</$tag>\n";
}
reset($data);
if($level == 0){ $str = &ob_get_contents(); ob_end_clean(); return $str; }
}
#-----------------------#
# XML class: utility class to be used with PHP's XML handling functions
#-----------------------#
class XML{
var $parser; #a reference to the XML parser
var $document; #the entire XML structure built up so far
var $parent; #a pointer to the current parent - the parent will be an array
var $stack; #a stack of the most recent parent at each nesting level
var $last_opened_tag; #keeps track of the last tag opened.
function XML(){
$this->parser = &xml_parser_create();
xml_parser_set_option(&$this->parser, XML_OPTION_CASE_FOLDING, false);
xml_set_object(&$this->parser, &$this);
xml_set_element_handler(&$this->parser, 'open','close');
xml_set_character_data_handler(&$this->parser, 'data');
}
function destruct(){ xml_parser_free(&$this->parser); }
function & parse(&$data){
$this->document = array();
$this->stack = array();
$this->parent = &$this->document;
return xml_parse(&$this->parser, &$data, true) ? $this->document : NULL;
}
function open(&$parser, $tag, $attributes){
$this->data = ''; #stores temporary cdata
$this->last_opened_tag = $tag;
if(is_array($this->parent) and array_key_exists($tag,$this->parent)){ #if you've seen this tag before
if(is_array($this->parent[$tag]) and array_key_exists(0,$this->parent[$tag])){ #if the keys are numeric
#this is the third or later instance of $tag we've come across
$key = count_numeric_items($this->parent[$tag]);
}else{
#this is the second instance of $tag that we've seen. shift around
if(array_key_exists("$tag attr",$this->parent)){
$arr = array('0 attr'=>&$this->parent["$tag attr"], &$this->parent[$tag]);
unset($this->parent["$tag attr"]);
}else{
$arr = array(&$this->parent[$tag]);
}
$this->parent[$tag] = &$arr;
$key = 1;
}
$this->parent = &$this->parent[$tag];
}else{
$key = $tag;
}
if($attributes) $this->parent["$key attr"] = $attributes;
$this->parent = &$this->parent[$key];
$this->stack[] = &$this->parent;
}
function data(&$parser, $data){
if($this->last_opened_tag != NULL) #you don't need to store whitespace in between tags
$this->data .= $data;
}
function close(&$parser, $tag){
if($this->last_opened_tag == $tag){
$this->parent = $this->data;
$this->last_opened_tag = NULL;
}
array_pop($this->stack);
if($this->stack) $this->parent = &$this->stack[count($this->stack)-1];
}
}
function count_numeric_items(&$array){
return is_array($array) ? count(array_filter(array_keys()($array), 'is_numeric')) : 0;
}
?>
应用实例,XML来源地址:http://data.cnaz.com/spread/?tid=7&sid=42845&order=date&flags=desc&num=50
&page=1&hosts=pic.ttiankan.com&code=xml
<?php
include('xml.php'); //引用PHP XML操作类
$page=$_GET['page'];
if(empty($page) || !is_numeric($page)) $page=1;
//偶像明星
$xml = file_get_contents('http://data.cnaz.com/spread/?tid=7&sid=42845&order=date&flags=desc&num=50
&page='.$page.'&hosts=pic.ttiankan.com&code=xml');
//$xml = file_get_contents("php://input"); //读取POST过来的输入流
$data=XML_unserialize($xml);
$item=$data['rss']['channel'];
$link = $item['link'];
$description= $item['description'];
$keywords = $item['keywords'];
$totalnum = $item['totalnum'];
$usetime = $item['usetime'];
$totalpage=ceil($totalnum/50);
echo('<div >关键字:'.$keywords.' ');
echo('总记录数:'.$totalnum.', 每页显示50条,一共有'.$totalpage.'页, 当前是第'.$page.'页</div>');
$item=$item['item'];
echo('
<style>
*{font-size:12px;color:#000;font-family:arial;}
a{text-decoration:none;}
a:hover{text-decoration:underline;}
.tbl{border-top:1px #ccc solid;border-left:1px #ccc solid;}
.tbl td{padding:4px 5px;border-bottom:1px #ccc solid;border-right:1px #ccc solid;}
</style>
');
echo('
<table cellspacing="0" cellpadding="0" border="0" width="600">
<tr>
<td>分类</td>
<td>标题</td>
<td>链接</td>
</tr>
');
foreach($item as $list)
{
echo('<tr>');
echo('<td>'.$list['sort'].'</td>');
echo('<td><a title="'.$list['description'].'" href="'.$list['photo'].'" target="_blank">'.$list['title'].'</a></td>');
echo('<td><a href="'.$list['link'].'" target="_blank">'.$list['link'].'</a></td>');
echo('</tr>');
}
echo('<tr>
<td colspan="3">
');
if($page>1) echo('<a href="/blog_article/b/page/.html'.($page-1).'">上一页</a> ');
if($page<$totalpage) echo('<a href="/blog_article/b/page/.html'.($page+1).'">下一页</a>');
echo('</td></tr>');
echo('</table>');
?>
编辑为您推荐:
php操作xml的实例代码
php读写xml文件的方法介绍
php使用函数方式输出XML文件的例子
php使用函数方式读取XML文件的例子
PHP读取XML的几种方法
PHP读取XML值的代码
php操作xml的各种方法解析
PHP生成xml文件的4种方法
php生成xml简单实例详解
php向xml中添加数据一例
实例学习PHP操作XML的类DOMDocument
php URL各部分获取方法(全局变量),主要介绍php全局变量$_SERVER的用法,有需要的朋友,可以参考下。
1、$_SESSION['PHP_SELF'] — 获取当前正在执行脚本的文件名
2、$_SERVER['SERVER_PROTOCOL'] — 请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。
3、$_SERVER['REQUEST_TIME'] — 请求开始时的时间戳。从 PHP 5.1.0 起有效。和time函数效果一样。
4、$_SERVER['argv'] — 传递给该脚本的参数。我试了下,get方法可以得到$_SERVER['argv'][0];post方法无法给他赋值。
5、$_SERVER['SERVER_NAME'] — 返回当前主机名。
6、$_SERVER['SERVER_SOFTWARE'] — 服务器标识的字串,在响应请求时的头信息中给出。 如Microsoft-IIS/6.0
7、$_SERVER['REQUEST_METHOD'] — 访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。
8、$_SERVER['QUERY_STRING'] — 查询(query)的字符串(URL 中第一个问号 ? 之后的内容)。
9、$_SERVER['DOCUMENT_ROOT'] — 当前运行脚本所在的文档根目录。在服务器配置文件中定义。 如E:\server
10、$_SERVER['HTTP_ACCEPT'] — 当前请求的 Accept: 头信息的内容。
11、$_SERVER['HTTP_ACCEPT_CHARSET'] — 当前请求的 Accept-Charset: 头信息的内容。例如:“iso-8859-1,*,utf-8”。
12、$_SERVER['HTTP_ACCEPT_ENCODING'] — 当前请求的 Accept-Encoding: 头信息的内容。例如:“gzip”。
13、$_SERVER['HTTP_ACCEPT_LANGUAGE'] — 当前请求的 Accept-Language: 头信息的内容。例如:“en”。
14、$_SERVER['HTTP_CONNECTION'] — 当前请求的 Connection: 头信息的内容。例如:“Keep-Alive”。
15、$_SERVER['HTTP_HOST'] — 当前请求的 Host: 头信息的内容。
16、$_SERVER['HTTP_REFERER'] — 链接到当前页面的前一页面的 URL 地址。
17、$_SERVER['HTTP_USER_AGENT'] — 返回用户使用的浏览器信息。也可以使用 get_browser() 得到此信息。
18、$_SERVER['HTTPS'] — 如果通过https访问,则被设为一个非空的值,否则返回off.
19、$_SERVER['REMOTE_ADDR'] — 正在浏览当前页面用户的 IP 地址。
20、$_SERVER['REMOTE_HOST'] — 正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR。如本地测试返回127.0.0.1
21、$_SERVER['REMOTE_PORT'] — 用户连接到服务器时所使用的端口。我在本机测试没通过,不知道什么原因。
22、$_SERVER['SCRIPT_FILENAME'] — 当前执行脚本的绝对路径名。如返回E:\server\index.php
23、$_SERVER['SERVER_ADMIN'] — 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值
24、$_SERVER['SERVER_PORT'] — 服务器所使用的端口。默认为“80”。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
25、$_SERVER['SERVER_SIGNATURE'] — 包含服务器版本和虚拟主机名的字符串。
26、$_SERVER['PATH_TRANSLATED'] — 当前脚本所在文件系统(不是文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。
Apache 2 用 户可以使用 httpd.conf 中的 AcceptPathInfo On 来定义 PATH_INFO。
27、$_SERVER['SCRIPT_NAME'] — 包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 包含当前文件的绝对路径和文件名(例如包含文件)。
28、$_SERVER['REQUEST_URI'] — 访问此页面所需的 URI。例如,“/index.html”。
29、$_SERVER['PHP_AUTH_DIGEST'] — 当作为 Apache 模块运行时,进行 HTTP Digest 认证的过程中,此变量被设置成客户端发送的“Authorization”HTTP 头内容(以便作进一步的认证操作)。
30、$_SERVER['PHP_AUTH_USER']– 当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
31、$_SERVER['PHP_AUTH_PW'] — 当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
32、$_SERVER['AUTH_TYPE']–当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。
附:使用parse_url函数获取URL各个部分
示例1:
$parts = parse_url(/blog_article/$url/index.html);
输出:
Array
(
[scheme] => http
[host] => www.electrictoolbox.com
[path] => /php-extract-domain-from-full-url/
)
示例2:
$url = 'http://username:password@hostname/path?arg=value#anchor';
print_r(parse_url(/blog_article/$url/index.html));
echo parse_url(/blog_article/$url, PHP_URL_PATH/index.html);
?>
输出:
Array
(
[scheme] => http
[host] => hostname
[user] => username
[pass] => password
[path] => /path
[query] => arg=value
[fragment] => anchor
)
很容易便分解出一个URL的各个部,取指定的部分出来也很容易:
echo parse_url(/blog_article/$url, PHP_URL_PATH/index.html);
在第二个参数中,设定如下的参数:
PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER, PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY or PHP_URL_FRAGMENT。