<!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
>
<
HTML
>
<
HEAD
>
<
TITLE
>
使firefox对xml的处理兼容IE的selectSingleNode selectNodes方法
</
TITLE
>
<
META
NAME
="Author"
CONTENT
="emu"
>
<
META
NAME
="Keywords"
CONTENT
="firefox IE selectSingleNode selectNodes"
>
<
META
NAME
="Description"
CONTENT
="使firefox可以支持selectSingleNode selectNodes方法"
>
<
SCRIPT
LANGUAGE
="JavaScript"
>
<!--
var
isIE
=
!!
document.all;
function
parseXML(st){
if
(isIE){
var
result
=
new
ActiveXObject(
"
microsoft.XMLDOM
"
);
result.loadXML(st);
}
else
{
var
parser
=
new
DOMParser();
var
result
=
parser.parseFromString(st,
"
text/xml
"
);
}
return
result;
}
if
(
!
isIE){
var
ex;
XMLDocument.prototype.__proto__.__defineGetter__(
"
xml
"
,
function
(){
try
{
return
new
XMLSerializer().serializeToString(
this
);
}
catch
(ex){
var
d
=
document.createElement(
"
div
"
);
d.appendChild(
this
.cloneNode(
true
));
return
d.innerHTML;
}
});
Element.prototype.__proto__.__defineGetter__(
"
xml
"
,
function
(){
try
{
return
new
XMLSerializer().serializeToString(
this
);
}
catch
(ex){
var
d
=
document.createElement(
"
div
"
);
d.appendChild(
this
.cloneNode(
true
));
return
d.innerHTML;
}
});
XMLDocument.prototype.__proto__.__defineGetter__(
"
text
"
,
function
(){
return
this
.firstChild.textContent
});
Element.prototype.__proto__.__defineGetter__(
"
text
"
,
function
(){
return
this
.textContent
});
XMLDocument.prototype.selectSingleNode
=
Element.prototype.selectSingleNode
=
function
(xpath){
var
x
=
this
.selectNodes(xpath)
if
(
!
x
||
x.length
<
1
)
return
null
;
return
x[
0
];
}
XMLDocument.prototype.selectNodes
=
Element.prototype.selectNodes
=
function
(xpath){
var
xpe
=
new
XPathEvaluator();
var
nsResolver
=
xpe.createNSResolver(
this
.ownerDocument
==
null
?
this
.documentElement :
this
.ownerDocument.documentElement);
var
result
=
xpe.evaluate(xpath,
this
, nsResolver,
0
,
null
);
var
found
=
[];
var
res;
while
(res
=
result.iterateNext())
found.push(res);
return
found;
}
}
var
x
=
parseXML(
"
<people> <person first-name=\
"
eric\
"
middle-initial=\
"
H\
"
last-name=\
"
jung\
"
> <address street=\
"
321
south st\
"
city=\
"
denver\
"
state=\
"
co\
"
country=\
"
usa\
"
/> <address street=\
"
123
main st\
"
city=\
"
arlington\
"
state=\
"
ma\
"
country=\
"
usa\
"
/> </person> <person first-name=\
"
jed\
"
last-name=\
"
brown\
"
> <address street=\
"
321
north st\
"
city=\
"
atlanta\
"
state=\
"
ga\
"
country=\
"
usa\
"
/> <address street=\
"
123
west st\
"
city=\
"
seattle\
"
state=\
"
wa\
"
country=\
"
usa\
"
/> <address street=\
"
321
south avenue\
"
city=\
"
denver\
"
state=\
"
co\
"
country=\
"
usa\
"
/> </person></people>
"
);
alert(
"
搜索所有人的姓氏(last-name)
"
)
var
results
=
x.selectNodes(
"
//person/@last-name
"
);
for
(
var
i
=
0
; i
<
results.length;i
++
)
alert(
"
Person #
"
+
i
+
"
has the last name
"
+
results[i].nodeValue);
alert(
"
搜索第二个人
"
);
//
IE是以0为下标基数的,而不是1
if
(
!
document.all)
results
=
x.selectSingleNode(
"
/people/person[2]
"
);
else
results
=
x.selectSingleNode(
"
/people/person[1]
"
);
alert(results.xml)
alert(
"
获得住址在donver街上的人
"
);
results
=
x.selectNodes(
"
//person[address/@city='denver']
"
);
for
(
var
i
=
0
; i
<
results.length;i
++
)alert(results[i].xml)
if
(
!
document.all){
//
获得所有街名中带south的地址
results
=
x.selectNodes(
"
//address[contains(@street, 'south')]
"
);
alert(results[
0
].xml);
}
else
{
alert(
"
IE不支持 //address[contains(@street, 'south')] 这种查询方式
"
)
}
//
-->
</
SCRIPT
>
</
HEAD
>
<
BODY
>
</
BODY
>
</
HTML
>
例子引自
http://kb.mozillazine.org/XPath 。从例子可以看到,IE对xpath的支持还是有限度的。