作者s25g5d4 (死城盜賊)
看板Ajax
標題[教學] XML解析
時間Wed Aug 18 22:32:29 2010
本篇是取材自
#1CQqSnH0 (Ajax)
範例網頁:
http://s25g5d4.sg1010.myweb.hinet.net/Untitled-1.html
XML重新格式化一遍
<?xml version="1.0" encoding="utf-8"?>
<data>
<array
key="0">
<value
key="no">
40205</value>
<value
key="name">
LL</value>
</array>
<array
key="1">
<value
key="no">
40204</value>
<value
key="name">
KK</value>
</array>
</data>
------------------------正文開始---------------------
XMLHttpRequest的封裝就不說了 直接看怎麼解析XML
function initPage(
data) {
var a
= data.getElementsByTagName
("array"),
b
= function (
a) {
var i
= 0, aLength
= a.length, b
= [];
for(i; i
< aLength; i
++) {
b.push
(a
[i
].getElementsByTagName
("value"));
}
return b;
}
(a),
content
= '',
i
= 0;
do {
content
+= "<h1>第" + a
[i
].getAttribute
('key') + "組資料</h1>";
for(
var j
= 0, bLength
= b
[i
].length; j
< bLength; j
++) {
content
+= b
[i
][j
].getAttribute
("key") + " : " +
(b
[i
][j
].textContent
|| b
[i
][j
].text)
+ "<br />";
}
i
++;
}
while(i
< bLength);
document.write
(content);
}
其實XML DOM可以像HTML DOM一樣存取 不難阿~
b看起來好像是function 但其實是陣列 WHY?
因為我在匿名函數後面加上(a) 使得匿名函數被執行且帶入一個參數a 而傳回一個陣列
之後就是一直push東西進一個暫存陣列b
又因為這個匿名函數與原本的函數是不同的作用域了 所以變數名重複也沒關係
這就是閉包的應用 (其實我不太確定這句話啦...)
所以以本例的xml來看 a[0]是第一個<array> a[1]是第二個<array>
b[0]是第一個<array>中的每個<value>
又應用到了陣列中的陣列 所以b[0][0]代表第一個<array>中的第一個<value>
b[0][1]代表第一個<array>中的第二個<value>
b[1][0]代表第二個<array>中的第一個<value>
……
以此類推
以圖例來說就是
a┬─
0 ─
<array key="0">
│
└─
1 ─
<array key="1">
b┬─
0 ┬─
0 ─
<array key="0">中的
<value key="no">
│ │
│ └─
1 ─
<array key="0">中的
<value key="name">
│
└─
1 ┬─
0 ─
<array key="1">中的
<value key="no">
│
└─
1 ─
<array key="1">中的
<value key="name">
之後就是do{}while()迴圈
比較有問題的應該是(b[i][j].textContent || b[i][j].text)
這邊其實是考慮到相容性問題 ff支援前者 IE支援後者
順便說一下 || 這個布林符號
這是邏輯中的"或" "or"的意思 也就是兩者之一是真 則結果就是真
其檢查的順序為先檢查左邊
如果左邊為假才檢查右邊
所以左邊為真的話就是丟出左邊的值 左邊為假則檢查右邊
右邊為真就丟出右邊的值
嗯...應該是差不多了吧 有問題再發問就好 不過我能回答的有限阿~
我是真˙遜咖 來這邊賺P幣的 囧~
其實還有更好用的XPath...
--
五樓的你說 衛生棉可以吃嗎?( ‵□′)───C<─___-)|||
1F:推 stnighter:蓋蓋08/15 19:01
2F:推 airplanewale:5樓咀嚼中無法說話。08/15 19:02
3F:推 shaka1aka:原來麵包有蘋果味的(筆記)08/15 19:03
4F:推 max0526:五樓咀嚼的滿口是血還是津津有味08/15 19:04
5F:推 rainbow7914:蓋08/15 19:04
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.172.101.248
重新整理code
※ 編輯: s25g5d4 來自: 218.172.101.248 (08/18 22:34)
居然忘了PO範例...
※ 編輯: s25g5d4 來自: 218.172.101.248 (08/18 22:36)
6F:→ s25g5d4:IE 7↓還沒試過... 08/18 22:37
改一下色碼...
※ 編輯: s25g5d4 來自: 218.172.83.123 (08/19 12:10)
7F:→ s25g5d4:被m了 自己推一個 08/27 20:27
上色好好玩@@"
※ 編輯: s25g5d4 來自: 220.142.81.195 (09/05 00:09)