var xmlStr = 'rootpeoplename張三/nameaddress北京/address/people/root';
成都創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的臺山網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
var result = null;
eval('result=['+$(xmlStr).find('people').map(function(){
return '{'+$('*',this).map(function(){
return $(this).attr('tagName') + ':"' + $(this).text() + '"';
}).get().join(',') + '}';
}).get().join('],[')+']');
alert(result);
//result是一個數(shù)組,如果有多個people節(jié)點,則為:[{name:"張三",address="北京"},{name:"李四",address="上海"}]
不好意思偏題了,以下是你要的結(jié)果:
var result = $(xmlStr).find('people').children().map(function(){
return $(this).attr('tagName')+'='+$(this).text();
}).get().join();
上面的都是jquery的寫法:
javascript的話:
用COM操作:
object xmlDoc = new ActiveObject('msxml2');
xmlDoc.loadXml(xmlStr);
var pNode = xmlDoc.selectSignNode('people');
var result = '';
for(var node in pNode.selectNodes('*')){
result+=(result.length0?',':'') + node.nodeName+'='+node.innerText;
}
alert(reuslt);
或者用DOM操作:
xml id='testXml' /
var result = '';
with(document.getElementById('testXml')){
innerHTML = xmlStr;
for(var child in children){
result += ',' + child.tagName + '=' + child.innerText;
}
if(result.length 0){
result = result.substring(1);
}
}
那個冒號前面的w叫namespace,xml里面都會用xmlns:w="xxxx"來規(guī)定這個w所代表的url。所以兩個namespace如果指向同一個url的話,那就算一樣。其實如果你要顯示word文檔的話,直接用Word Online Application貼在你的網(wǎng)頁里面就好了,反正不用錢
var
qsData
=
{'searchWord':$("#searchWord").attr("value"),'currentUserId':$("#currentUserId").attr("value"),'conditionBean.pageSize':$("#pageSize").attr("value")};
$.ajax({
async:false,
url:
http://跨域的dns/document!searchJSONResult.action,
type:
"GET",
dataType:
'jsonp',
jsonp:
'jsoncallback',
data:
qsData,
timeout:
5000,
beforeSend:
function(){
//jsonp
方式此方法不被觸發(fā).原因可能是dataType如果指定為jsonp的話,就已經(jīng)不是ajax事件了
},
success:
function
(json)
{//客戶端jquery預(yù)先定義好的callback函數(shù),成功獲取跨域服務(wù)器上的json數(shù)據(jù)后,會動態(tài)執(zhí)行這個callback函數(shù)
if(json.actionErrors.length!=0){
alert(json.actionErrors);
}
genDynamicContent(qsData,type,json);
},
complete:
function(XMLHttpRequest,
textStatus){
$.unblockUI({
fadeOut:
10
});
},
error:
function(xhr){
//jsonp
方式此方法不被觸發(fā).原因可能是dataType如果指定為jsonp的話,就已經(jīng)不是ajax事件了
//請求出錯處理
alert("請求出錯(請檢查相關(guān)度網(wǎng)絡(luò)狀況.)");
}
});
注意:$.getJSON("
http://跨域的dns/document!searchJSONResult.action?name1="+value1+"jsoncallback=?",
function(json){
if(json.屬性名==值){
//
執(zhí)行代碼
}
});
這種方式其實是上例$.ajax({..})
api的一種高級封裝,有些$.ajax
api底層的參數(shù)就被封裝而不可見了.
這樣,jquery就會拼裝成如下的url
get請求
http://跨域的dns/document!searchJSONResult.action?jsoncallback=jsonp1236827957501_=1236828192549searchWord=%E7%94%A8%E4%BE%8B¤tUserId=5351conditionBean.pageSize=15
在響應(yīng)端(http://跨域的dns/document!searchJSONResult.action),
通過
jsoncallback
=
request.getParameter("jsoncallback")
得到j(luò)query端隨后要回調(diào)的js
function
name:jsonp1236827957501
然后
response的內(nèi)容為一個Script
Tags:"jsonp1236827957501("+按請求參數(shù)生成的json數(shù)組+")";
jquery就會通過回調(diào)方法動態(tài)加載調(diào)用這個js
tag:jsonp1236827957501(json數(shù)組);
這樣就達(dá)到了跨域數(shù)據(jù)交換的目的.
jsonp的最基本的原理是:動態(tài)添加一個script標(biāo)簽,而script標(biāo)簽的src屬性是沒有跨域的限制的。這樣說來,這種跨域方式其實與ajax
XmlHttpRequest協(xié)議無關(guān)了.
這樣其實"jQuery
AJAX跨域問題"就成了個偽命題了,jquery
$.ajax方法名有誤導(dǎo)人之嫌.
如果設(shè)為dataType:
'jsonp',
這個$.ajax方法就和ajax
XmlHttpRequest沒什么關(guān)系了,取而代之的則是JSONP協(xié)議.
JSONP是一個非官方的協(xié)議,它允許在服務(wù)器端集成Script
tags返回至客戶端,通過javascript
callback的形式實現(xiàn)跨域訪問
JSONP即JSON
with
Padding。由于同源策略的限制,XmlHttpRequest只允許請求當(dāng)前源(域名、協(xié)議、端口)的資源。如果要進行跨域請求,
我們可以通過使用html的script標(biāo)記來進行跨域請求,并在響應(yīng)中返回要執(zhí)行的script代碼,其中可以直接使用JSON傳遞javascript對象。
這種跨域的通訊方式稱為JSONP。
jsonCallback
函數(shù)jsonp1236827957501(....):
是瀏覽器客戶端注冊的,獲取跨域服務(wù)器上的json數(shù)據(jù)后,回調(diào)的函數(shù)
Jsonp原理:
首先在客戶端注冊一個callback
(如:'jsoncallback'),
然后把callback的名字(如:jsonp1236827957501)傳給服務(wù)器。
此時,服務(wù)器先生成
json
數(shù)據(jù)。
然后以
javascript
語法的方式,生成一個function
,
function
名字就是傳遞上來的參數(shù)
'jsoncallback'的值
jsonp1236827957501
.
最后將
json
數(shù)據(jù)直接以入?yún)⒌姆绞?,放置?/p>
function
中,這樣就生成了一段
js
語法的文檔,返回給客戶端。
客戶端瀏覽器,解析script標(biāo)簽,并執(zhí)行返回的
javascript
文檔,此時javascript文檔數(shù)據(jù),作為參數(shù),
傳入到了客戶端預(yù)先定義好的
callback
函數(shù)(如上例中jquery
$.ajax()方法封裝的的success:
function
(json))里.(動態(tài)執(zhí)行回調(diào)函數(shù))
可以說jsonp的方式原理上和script
src="http://跨域/...xx.js"/script是一致的(qq空間就是大量采用這種方式來實現(xiàn)跨域數(shù)據(jù)交換的)
.JSONP是一種腳本注入(Script
Injection)行為,所以也有一定的安全隱患.
注意,jquey是不支持post方式跨域的.
為什么呢?
雖然采用post
+動態(tài)生成iframe是可以達(dá)到post跨域的目的(有位js牛人就是這樣把jquery1.2.5
打patch的),但這樣做是一個比較極端的方式,不建議采用.
也可以說get方式的跨域是合法的,post方式從安全角度上,被認(rèn)為是不合法的,
萬不得已還是不要劍走偏鋒..
client端跨域訪問的需求看來也引起w3c的注意了,看資料說html5
WebSocket標(biāo)準(zhǔn)支持跨域的數(shù)據(jù)交換,應(yīng)該也是一個將來可選的跨域數(shù)據(jù)交換的解決方案.
jquery的 text()僅能讀取出xml中不含標(biāo)簽的文字部分。
而 html() 辦法也絕對讀不出xml中的標(biāo)簽。
現(xiàn)在給你兩種解決辦法:
辦法一,不用ajax,而用jquery的load()辦法。前提是你知道load()怎么用。
將你需要讀取的的xml代碼塊外面套一層html標(biāo)簽,比如div什么的,再給他加個ID,比如:
info
div id="xxx"
小牛情侶紙巾套,很可愛的一對小情侶哦!br /
趕快領(lǐng)回家吧!br /
超軟的面料,超可愛的造型,冷冷的冬天抱在手上也是br /
很享受的事情哦!/div/info
這樣,用
$("選擇器").load("xml文件的url #xxx")
就可以讀出。
這辦法有2種缺點。
一,這辦法不是ajax,雖然有點像
二,需要改動xml原文件。
辦法二,使用一小段jquery插件:
/**
* jQuery xml plugin - Converts XML node(s) to string
* Dual licensed under the MIT and GPL
* Copyright (c) 2009 Radim Svoboda
* @version 1.0.0
*/
jQuery.fn.xml=function(all){var s="";if(this.length)
(((typeof all!='undefined')all)?this:jQuery(this[0]).contents()).each(function());return s;};
以上為插件代碼。
使用以上代碼后,就可以使用ajax讀取xml文件中的文字和標(biāo)簽了。比如:
$.get('xml文件url',function(data));
其中xml()括號里有兩個參數(shù)0和1可以選。
0代表讀取 info標(biāo)簽里面的內(nèi)容
1代表讀取 info標(biāo)簽以及標(biāo)簽里面的內(nèi)容
這種辦法,缺點暫時沒發(fā)現(xiàn)。
好了,我寫了那么多,分給我吧?