?
<!
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 >
< 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的支持還是有限度的。