使用Javascript和PHP对服务端XML文档进行操作
来源:互联网 发布:linux 启动ftp服务 编辑:程序博客网 时间:2024/05/20 02:22
编辑工具与测试环境
netbeans 7.2.1
主要用来创建一个php项目,用于编辑php程序。
webstorm 6
主要用来方便javascript代码的编写工作。
xampp 1.8.1
主要需要使用其中的apache服务器。
chrome 26.0.1386.0
用来调试javascript代码
代码
index.html
<html> <head> <meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> <title>AJAX with PHP: Quickstart</title> <link rel=stylesheet href="css/mystyle.css" type="text/css"> <script type="text/javascript" src="js/myutil.js"></script> <script type="text/javascript" src="js/quickstart.js"></script> </head> <body> <div> <div id="xmltable"> </div> <div class="getxml"> <input type="button" onclick="getXmlFromPhp()" value="获取XML文档" /> </div> </div> <div> <div class="editxml"> <table border="1" class="fancytable" id=table2> <tr class="headerrow"> <td>CD专辑名</td> <td>表演者</td> <td>国家</td> <td>发行公司</td> <td>售价</td> <td>出版年份</td> </tr> <tr class="datarowodd" id="editform" name="editform"> <td><input type="text" id="title" name="title"/></td> <td><input type="text" id="artist" name="artist"/></td> <td><input type="text" id="country" name="country"/></td> <td><input type="text" id="company" name="company"/></td> <td><input type="text" id="price" name="price"/></td> <td><input type="text" id="year" name="year"/></td> </tr> </table> </div> <div> <input type="button" onclick="appendRecord()" value="添加记录" /> <input type="button" onclick="deleteRecord()" value="删除记录" /> </div> </div> </body></html>
js/myutil.js中的函数
函数:createXmlHttpRequestObject()
//获取XMLHttpRequest对象function createXmlHttpRequestObject(){ var xmlhttp; //IE if(window.ActiveXObject){ try{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }catch (e){ xmlhttp = false; } } //Mozilla或其他browsers else{ try{ xmlhttp = new XMLHttpRequest(); }catch (e){ xmlhttp = false; } } if (!xmlhttp){ alert("实例化XMLHttpRequest对象出错."); return xmlhttp; } else return xmlhttp;}
函数:isnull()
//判断子节点是否为空function isnull(obj){ var nodevalue = ""; if(obj.childNodes[0] != null) { nodevalue =obj.childNodes[0].nodeValue; } return nodevalue;}
函数:xml2string(node)
function xml2string(node) { if (typeof(XMLSerializer) !== 'undefined') { var serializer = new XMLSerializer(); return serializer.serializeToString(node); } else if (node.xml) { return node.xml; }}
js/quickstart.js中的函数
变量
//保存XMLHttpRequest对象引用var xmlHttp = createXmlHttpRequestObject();//保存鼠标点击的表格table1的当前一行记录对应的HTML元素tr的id属性的值var currentRecord;//用于保存XML的DOM对象var orderDoc;
函数:getDataByid(number)
//根据编号获取数据function getDataByid(number){ //获取number序号的CD元素节点的所有子元素节点的值 var title =isnull(orderDoc.getElementsByTagName("TITLE")[number]); var artist =isnull(orderDoc.getElementsByTagName("ARTIST")[number]); var country =isnull(orderDoc.getElementsByTagName("COUNTRY")[number]); var company = isnull(orderDoc.getElementsByTagName("COMPANY")[number]); var price =isnull(orderDoc.getElementsByTagName("PRICE")[number]); var year =isnull(orderDoc.getElementsByTagName("YEAR")[number]); var test = number%2; var std =""; //根据number的奇偶性添加,表格记录行 if(test == 1) { std='<tr id='+'"'+ (number+1) +'"' + 'class="datarowodd">' + '<td>'+(title)+'</td><td>'+(artist)+'</td><td>'+(country)+'</td>' + '<td>'+(company)+'</td><td>'+(price)+'</td><td>'+(year)+'</td>' + '</tr>'; }else if(test == 0){ std='<tr id='+'"'+ (number+1) +'"' + 'class="dataroweven">' + '<td>'+(title)+'</td><td>'+(artist)+'</td><td>'+(country)+'</td>' + '<td>'+(company)+'</td><td>'+(price)+'</td><td>'+(year)+'</td>' + '</tr>'; } return std;}
函数:getContent()
/*获取XML文档树中所有CD元素节点,并以HTML表格形式保存 */function getContent(){ var stringsss = ""; //获取CD元素节点的个数 var items=orderDoc.getElementsByTagName("CD").length; //添加HTML表格,以及表格标题行 stringsss+='<table border="1" class="fancytable" id=table1>' + '<tr class="headerrow">' + '<td>CD专辑名</td><td>表演者</td><td>国家</td>' + '<td>发行公司</td><td>售价</td><td>出版年份</td></tr>'; //将每一个CD元素节点内容作为表格的一行记录 for(i=0;i<items;i++){ stringsss+=getDataByid(i); } //添加HTML表格结束标签 stringsss+='</table>' //在HTML文档中的id="xmltable"元素内容中添加stringsss字符串,即表格的HTML代码串。 document.getElementById("xmltable").innerHTML = stringsss; //为表格的每行添加onclick事件处理方法 addTrEvent();}
函数:getXmlFromPhp()
/*构造并发送HTTP请求,请求服务器发送XML文档 */function getXmlFromPhp(){ //判断XMLHttpRequest对象是否空闲 if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) { xmlHttp.open("GET", "sendXML.php", true); //指定处理服务器响应内容的方法 xmlHttp.onreadystatechange = recvServerXml; //向服务器发送请求 xmlHttp.send(null); }else{ alert("XMLHttpRequest对象忙!"); setTimeout('getXmlFromPhp()', 1000); }}
函数:recvServerXml()
/*处理服务端发送来的XML文档内容用来根据接收到的XML文档,生成HTML表格代码 */function recvServerXml(){ //当传送完成才继续 if (xmlHttp.readyState == 4){ //状态200表示传送成功完成 if (xmlHttp.status == 200){ //提取从服务器返回的XML文档 xmlResponse = xmlHttp.responseXML; //将获取的XML文档DOM树结构对象赋值给全局变量orderDoc,以备之后使用 orderDoc = xmlResponse; //构造HTML表格 getContent(); } //如果返回一个非200的HTTP状态,则表示出错 else{ alert("在访问服务器时出现错误: " + xmlHttp.statusText); } }}
函数:saveXmlToPhp()
/*构造并发送HTTP请求,将修改的XML DOM对象发送给服务器端保存并将新的DOM对象返回,以便更新客户端。 */function saveXmlToPhp(){ if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) { xmlHttp.open("POST", "saveXML.php", true); //将XML DOM对象转换成字符串 var xmlstr = xml2string(orderDoc); //设置本次请求的结果处理方法 xmlHttp.onreadystatechange = recvServerXml; //将XML文档序列化字符串作为参数发给服务器 xmlHttp.send(xmlstr); }else{ alert("XMLHttpRequest对象忙!"); setTimeout('saveXmlToPhp()', 1000); }}
函数:appendRecord()
/*在本地的XML DOM对象中添加一个新的CD子节点 */function appendRecord(){ //对空白编辑框的计数 var emptyCount = 0; //循环检查table2中的文本编辑框,是否为全空,如果全为空则退出appendRecord() for(var i=0; i<6;i++){ if(document.getElementById("table2").getElementsByTagName("input")[i].value == ""){ emptyCount++; } } if(emptyCount >= 6){ alert("至少有一个记录项不为空"); return; } //保存CD元素的所有子元素名,以备循环创建子节点之用 var nodeNameArray = new Array("TITLE","ARTIST","COUNTRY","COMPANY","PRICE","YEAR"); //获取根元素节点 var root = orderDoc.documentElement; //获取DOM树中CD元素节点的个数 var cdnodeNum = orderDoc.getElementsByTagName("CD").length; //创建一个新元素节点:CD var newCdNode = orderDoc.createElement("CD"); //将id属性节点设置为新建的CD元素节点的属性 newCdNode.setAttribute("id",(cdnodeNum+1).toString()); //循环添加CD元素节点的各个子节点 for(var i=0; i< 6; i++){ //依据nodeNameArray数组中字符串的先后顺序创建CD的子元素节点 var cdChildNode = orderDoc.createElement(nodeNameArray[i]); //创建文本子节点 var textNode = orderDoc.createTextNode(document.getElementById("table2").getElementsByTagName("input")[i].value); //将文本子节点添加到新建的元素节点中 cdChildNode.appendChild(textNode); //将新建的元素节点添加为之前创建的CD元素节点中,作为其子元素节点。 newCdNode.appendChild(cdChildNode); } //将CD元素节点添加的根元素节点中,作为其子元素节点 root.appendChild(newCdNode); //请求服务器保存更新后的XML文档内容,并返回新的XML文档 saveXmlToPhp();}
函数:deleteRecord()
function deleteRecord(){ //获取XML DOM对象中所有CD元素节点 var cdNodeList = orderDoc.getElementsByTagName("CD"); //获取根元素节点 var rootElement = orderDoc.documentElement; //获取CD元素节点的个数 var cdNodeNum = cdNodeList.length; //循环找到一个id属性值等于currentRecord的CD元素节点,然后将CD元素节点,从根节点中移除 for(var i=0;i<cdNodeNum;i++){ if(cdNodeList[i].getAttribute("id") == currentRecord){ rootElement.removeChild(cdNodeList[i]); break; } } //获得移除后的XML DOM对象中的CD元素节点集 cdNodeList = orderDoc.getElementsByTagName("CD"); cdNodeNum = cdNodeList.length; //更新所有CD元素节点的id属性值 for(var i=0;i<cdNodeNum;i++){ cdNodeList[i].setAttribute("id",(i+1).toString()); } //请求服务器保存更新后的XML文档,并返回新的XML文档 saveXmlToPhp();}
函数:addTrEvent()
/*为table1的每行添加onclick事件处理方法 */function addTrEvent(){ var table = document.getElementById("table1"); for(var i=0;i<table.rows.length;i++){ table.rows[i].onclick = new Function("trFunc(this)") }}
函数:trFunc(tr)
/*点击表格记录行时,要处理的事情 */function trFunc(tr){ //记录当前点击的记录行tr元素的属性id的值,以便删除记录使用 if(!tr){ return; } currentRecord = tr.getAttribute("id"); if(window.cur){ if(tr.getAttribute("class") == "datarowodd") window.cur.style.background = "#efefef"; else if(tr.getAttribute("class") == "dataroweven") window.cur.style.background = "#fff"; } tr.style.background = "#CCC"; window.cur = tr; var childs = tr.childNodes; var items = childs.length; for(var i=0; i< items; i++){ if(childs[i].hasChildNodes()){ //如果有子节点(文本子节点),就将该子节点的值赋值给文本框 document.getElementById("table2").getElementsByTagName("input")[i].value = childs[i].firstChild.nodeValue; }else{ //如果没有文本子节点,也就是表格单元内容为空时,设置文本框内容为空 document.getElementById("table2").getElementsByTagName("input")[i].value = ""; } }}
sendXML.php
<?php
$xmlString = file_get_contents('cd_data.xml');header('Content-Type: text/xml;charset=utf-8');echo $xmlString;
?>
saveXML.php
<?php
$besavexml = file_get_contents("php://input");$XML = simplexml_load_string($besavexml);$XML->asXML('cd_data.xml');header('Content-Type: text/xml;charset=utf-8');echo $besavexml;
?>
css/mystyle.css
.fancytable{border:1px solid #cccccc; width:100%; border-collapse:collapse;}.fancytable td{border:1px solid #cccccc; color:#555555;text-align:left; line-height:28px;}.datarowodd{background-color:#ffffff;}.dataroweven{ background-color:#efefef;}.headerrow{ background-color:#0066cc;}.headerrow td{ color:#ffffff; text-align:center;}.coolborder{ border:1px solid #0066cc; padding:5px; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px;}
cd_data.xml
<?xml version="1.0" encoding="utf-8"?><CATALOG><CD><TITLE>Empire Burlesque</TITLE><ARTIST>Bob Dylan</ARTIST><COUNTRY>USA</COUNTRY><COMPANY>Columbia</COMPANY><PRICE>10.90</PRICE><YEAR>1985</YEAR></CD><CD><TITLE>Hide your heart</TITLE><ARTIST>Bonnie Tyler</ARTIST><COUNTRY>UK</COUNTRY><COMPANY>CBS Records</COMPANY><PRICE>9.90</PRICE><YEAR>1988</YEAR></CD><CD><TITLE>Greatest Hits</TITLE><ARTIST>Dolly Parton</ARTIST><COUNTRY>USA</COUNTRY><COMPANY>RCA</COMPANY><PRICE>9.90</PRICE><YEAR>1982</YEAR></CD><CD><TITLE>Still got the blues</TITLE><ARTIST>Gary Moore</ARTIST><COUNTRY>UK</COUNTRY><COMPANY>Virgin records</COMPANY><PRICE>10.20</PRICE><YEAR>1990</YEAR></CD><CD><TITLE>Eros</TITLE><ARTIST>Eros Ramazzotti</ARTIST><COUNTRY>EU</COUNTRY><COMPANY>BMG</COMPANY><PRICE>9.90</PRICE><YEAR>1997</YEAR></CD></CATALOG>
代码测试说明:
假设项目所有文件存放在xmldomtest文件夹中,则xmldomtest下的目录结构大致如下:
将xmldomtest这个文件夹拷贝到xampp的安装目录下的htdocs子目录中,启动apache服务器,然后在chrome浏览器地址栏中输入http://127.0.0.1/xmldomtest/index.html即可。
注意事项
所有文件保存到磁盘全部采用utf-8编码方式保存。
测试截图
本人只是略懂皮毛,刚刚初学,东拼西凑出此文章,其根本目的只作为备忘,如能为和我一样的初学者提供一点借鉴和帮助,就略感欣慰了。
- 使用Javascript和PHP对服务端XML文档进行操作
- 使用JavaScript和MSXML对XML文档进行访问
- 使用Java和JAXP对XML文档进行访问
- Linq:对XML文档进行排序操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- 使用 jsoup 对 HTML 文档进行解析和操作
- iOS sql用法
- Uva-101-The Blocks Problem
- 紧邻算法分类器之模拟图(二)
- Qt4连接mysql成功
- Asp.Net MVC 在后台获取PartialView、View文件生成的字符串
- 使用Javascript和PHP对服务端XML文档进行操作
- linux /dev 常见特殊设备介绍与应用[loop,null,zero,full,random]
- DHH推荐的五本书(未完待续)
- GetInputAwayTime
- [J2EE][SERVLET]OUT.PRINT和OUT.WRITE的区别
- 学习rtsp的一些心得
- uva 10795 A Different Task
- 1. x-loader执行流程分析
- c/c++/objective-c对于大端小端的判断分析