导读:
- 首先先明确XML 是一种用于标准结构化文档交换的数据格式(另一种JSON),你可以在 XML 教程 中找到更多有关 XML 的信息。
实现:
- XML一般格式:
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<!--传递的数据-->
<name>饮杯梦回酒</name>
<sex>male</sex>
</root>
- 如果想在PHP文件中获取XML中的数据,可以使用
file_get_contents()
函数(详情),此外事先必须先利用header()
函数(详情)来告诉浏览器将其按照XML文件格式解析,编写完XML和PHP文件后,在web页面处理Ajax请求的成功的回调中不再使用xhr.responseText
方法获取PHP返回的数据转而使用xhr.responseXML
,最终该函数会把整个文件读入到一个字符串中,通过与HTML一样的DOM操作拿数据(整体流程以上述XML文件为例):
1.PHP获取XML数据
<?php
header("Content-type:application/xml"); // 还有一种是类型是:text/xml 二者本质的区别在于编码,前者采用XML中自定义的编码(推荐)
echo file_get_contents("info.xml");
?>
2.在Ajax中获取数据
ps:这里我利用原生JS封装好了一个自己的myAjax方法(简书MarkDown不支持页内跳转,故源码放在页面底部)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="../myAjax-jQ.js"></script>
</head>
<body>
<script type="text/javascript">
window.onload = function() {
var btn = document.getElementsByTagName("button")[0];
btn.onclick = function() {
myAjax({
type: "GET",
url: "ajax-xml.php",
success: function(xhr) {
var res = xhr.responseXML; // res打印出来就是#document(与HTML的简直一模一样)
console.log(res.querySelector("name").innerHTML, res.querySelector("sex").innerHTML);
},
error: function(xhr) {
alert(xhr.status);
}
})
}
}
</script>
<button>发送请求</button>
</body>
</html>
最终在浏览器得到返回结果如下:
Result
总结:
- 以上就是PHP获取XML数据的核心代码,当然根据需求不同用到的方法也不尽相同,小伙伴应灵活应对(毕竟有我们万能的W3C)。
- 附自己封装的myAjax方法:
function obj_new(data) {
// 防止IE7↓有Ajax缓存,所以每次请求时都动态的改变URL参数
data.t = new Date().getTime();
var res = [];
for(var key in data) {
// URL中不能出现中文,使用encodeURIComponent方法进行转码
res.push(encodeURIComponent(key)+"="+encodeURIComponent(data[key]));
}
return res.join("&");
}
function myAjax(option) {
// 把传入的对象转化成URL字符串形式
if(option.data){
var str = obj_new(option.data);
}
var xmlhttp, timer;
// 创建异步请求对象
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}else {// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if(option.type.toUpperCase() == "GET") {
xmlhttp.open(option.type, option.url+"?"+str, true);
xmlhttp.send();
} else {
xmlhttp.open(option.type, option.url, true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(str);
}
xmlhttp.onreadystatechange = function() {
clearInterval(timer);
if(xmlhttp.readyState === 4) {
if(xmlhttp.status >= 200 && xmlhttp.status < 300 || xmlhttp.status == 304) {
option.success(xmlhttp);
} else {
option.error(xmlhttp);
}
}
}
// 判断是否传入了超时时间
if(option.timeout) {
timer = setInterval(function(){
console.log("中断请求");
xmlhttp.abort();
clearInterval(timer);
}, option.timeout)
}
}
网友评论