xml을 처리하는 웹페이지를 작성할 때 브라우저 호환성이 골치 아픈 문제인 경우가 많습니다. 그래서 일반적인 XML 작업을 함수로 캡슐화했습니다. 일정 기간의 개선 끝에 이제는 매우 안정적이고 사용하기 편리해졌습니다.
기능은 다음과 같습니다——
xml_loadFile: xml 동기/비동기 로딩.
xml_transformNode: xsl 변환.
xml_text: 노드의 텍스트입니다.
selectSingleNode: XPath를 기반으로 단일 노드를 선택합니다.
selectNodes: XPath를 기반으로 여러 노드를 선택합니다.
전체 코드(zyllibjs_xml.js) -
/*
zyllibjs_xml
XML 처리
@author zyl910
참고——
1. Chrome은 보안 메커니즘 제한으로 인해 로컬 파일을 읽을 수 없습니다.
참고
~~~~~~~~~
http://www.jinlie.net/?p=302
크롬 브라우저에서 XML 문서 로드
업데이트
~ ~ ~~~~~
[2011-11-02]
정의.
[2011-11-09]
xml_loadFile: 콜백 함수에 isError 매개변수를 추가합니다.
[2011-11-21]
selectSingleNode
selectNodes
*/
// XML 파일 로드 및 XML 문서 노드 반환
// 반환: 성공 시 개체 반환(동기식) 모드에서는 XML 문서 객체가 반환되고, 비동기 모드에서는 작업 객체가 반환되며, 실패할 경우 null이 반환됩니다.
// xmlUrl: xml 파일의 URL입니다.
// funcAsync: 콜백 함수. function onload(xmlDoc, isError){ ... }
function xml_loadFile(xmlUrl, funcAsync)
{
var xmlDoc =
var isChrome = false;
var asyncIs = (null!=funcAsync); // 비동기 로딩 여부. funcAsync가 비어 있지 않으면 비동기 로딩이 사용되고, 그렇지 않으면 동기 로딩이 사용됩니다.
// 매개변수 확인
if (""==xmlUrl) return null
if (asyncIs)
{
if ("function"!=typeof(funcAsync)) return null;
}
// XML 개체 만들기
try
{
xmlDoc = new ActiveXObject("Microsoft.XMLDOM") // IE 지원
}
catch(ex)
{
}
if (null==xmlDoc)
{
시도
{
// Firefox, Mozilla, Opera 등 지원
xmlDoc = document. implementation.createDocument("", "", null); // 빈 XML 문서 객체를 생성합니다.
}
catch(ex)
{
}
}
if (null==xmlDoc) return null
// XML 문서 로드
xmlDoc.async = asyncIs;
if (asyncIs)
{
if(window.ActiveXObject)
{
xmlDoc.onreadystatechange = function(){
if(xmlDoc.readyState == 4)
{
var isError = false;
if (null!=xmlDoc.parseError)
{
isError = (0!=xmlDoc.parseError.errorCode) // 0 성공, 실패 0개는 실패했습니다.
}
funcAsync(xmlDoc, isError);
}
}
}
else
{
xmlDoc.onload = function(){
funcAsync( xmlDoc, false)
}
}
}
try
{
xmlDoc.load(xmlUrl)
}
catch(ex)
{
// 경고(ex.message) // 브라우저가 Chrome인 경우 다음 예외가 발생합니다. 개체 #(문서)에 "load" 메서드가 없습니다.
isChrome =
xmlDoc = null; ;
}
if (isChrome)
{
var xhr = new XMLHttpRequest()
if (asyncIs) // 비동기
{
xhr.onreadystatechange = function( ){
if(xhr.readyState == 4)
{
funcAsync(xhr.responseXML, xhr.status != 200)
}
}
xhr.open( "GET", xmlUrl, true);
try // 비동기 모드에서는 콜백 함수가 오류를 처리합니다.
{
xhr.send(null)
}
catch(ex)
{
funcAsync(null, true)
return null; 🎜>return xhr; // 참고: 반환되는 것은 XMLHttpRequest입니다. 비동기 모드에서 반환 값을 테스트하려면 null만 사용하는 것이 좋습니다.
}
else // 동기
{
xhr.open("GET", xmlUrl, false);
xhr.send(null) // 동기 모드에서 호출자에 의해 예외 처리
xmlDoc = xhr.responseXML;
}
}
return xmlDoc;
}
// XSLT를 사용하여 XML 문서를 문자열로 변환합니다.
function xml_transformNode(xmlDoc, xslDoc)
{
if (null==xmlDoc) return "";
if (null==xslDoc) return ""
if (window.ActiveXObject) ) // IE
{
return xmlDoc.transformNode(xslDoc);
}
else // FireFox, Chrome
{
//XSLTProcesor 객체 정의
var xsltProcessor= new XSLTProcessor();
xsltProcessor.importStylesheet(xslDoc);
//TransformToDocument 메소드
var result=xsltProcessor.transformToDocument(xmlDoc); var xmls=new XMLSerializer(); rt = xmls.serializeToString(result);
return rt;
}
}
// 노드의 텍스트 가져오기
function xml_text(xmlNode)
{
if (null ==xmlNode) return "";
var rt
if (window.ActiveXObject) // IE
{
rt = xmlNode.text; 🎜> {
// FireFox, Chrome, ...
rt = xmlNode.textContent
}
if (null==rt) rt=xmlNode.nodeValue // XML DOM
return rt;
}
// 메소드를 추가합니다. FireFox 및 Chrome과 호환됩니다.
if (!window.ActiveXObject)
{
XMLDocument.prototype.selectSingleNode = Element.prototype.selectSingleNode = function (xpath)
{
var x = this.selectNodes(xpath)
if ( ! x ||
{
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 );
varfound = []; var res
while(res = result.iterateNext())
found.push(res );
찾은 항목 반환
}
}
Chrome 브라우저에서 XML 문서 로드 Chrome 브라우저는 XML 문서를 로드하는 로드 방법을 지원하지 않습니다. 온라인으로 검색한 후 다음 해결 방법이 필요합니다.
function loadXMLDoc( xml_name)
{
var xmlDoc;
try
{
xmlDoc = new ActiveXObject("Microsoft.XMLDOM") // IE 지원
}
catch(e)
{
시도
{
// Firefox, Mozilla, Opera 등 지원
xmlDoc = document.implementation.createDocument("", "", null) ;/ / 빈 XML 문서 개체를 만듭니다.
}
catch(e)
{
alert(e.message);
}
}
// XML 문서 로드
시도
{
xmlDoc.async = false; // 비동기 로딩 끄기
xmlDoc.load(xml_name)
}
catch(e)
{
// Alert(e.message) 브라우저가 Chrome인 경우 다음 예외를 포착합니다. 객체 #(문서)에는 "load" 메서드가 없으므로 다음 구현에서는 Chrome 로딩 XML 문서(대략 작성됨)를 지원합니다.
var xhr = new XMLHttpRequest() ;
xhr.open("GET", xml_name, false);
xhr.responseXML.documentElement;
return xmlDoc; >}
그런데 각 브라우저는 XML 문자열을 다르게 로드합니다.
IE는 loadXML() 메서드를 사용하여 XML 문자열을 구문 분석합니다.
FireFox 및 기타에서는 DOMParser 개체를 사용하여 XML 문자열을 구문 분석합니다.
var doc =parseXml.parseFromString(xml_str,"text/xml")