作者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)