>웹 프론트엔드 >JS 튜토리얼 >JavaScript 고급 프로그래밍 읽기 노트(21) JavaScript의 XML_javascript 기술

JavaScript 고급 프로그래밍 읽기 노트(21) JavaScript의 XML_javascript 기술

WBOY
WBOY원래의
2016-05-16 17:50:021129검색
1. IE의 XML DOM 지원
IE의 XML 지원은 ActiveX의 MSXML 라이브러리를 기반으로 합니다.
1. DOM 생성
MSXML의 새 버전마다 다른 XML DOM 개체가 생성되므로 새 XML DOM 버전을 선택해 보세요.
2. XML 로드
XML 로드에는 두 가지 유형이 있습니다.
XML 문자열 로드: loadXML(xml 문자열)
xml 파일 로드: 로드(xml 파일 경로). 기본적으로 파일 로딩은 비동기식으로 변경하려면 비동기 기능을 true로 변경하면 됩니다. ReadyState 및 onreadystatechange 이벤트 핸들러는 파일을 비동기적으로 로드할 때 사용됩니다. ReadyState에는 5개의 가능한 값이 있습니다.
0 - DOM이 어떤 정보도 초기화하지 않았습니다.
1 - DOM이 데이터 로드를 완료했습니다.
3 - DOM을 사용할 수 있지만 일부 부분은 아직 사용 가능하지 않을 수 있습니다.
 4——DOM이 완전히 로드되어 사용할 수 있습니다.
3. XML 가져오기
Microsoft는 각 노드에 xml 기능을 추가했기 때문에 XML을 가져오는 것이 매우 편리합니다. 아래 예를 참조하세요.
4. 설명 오류
XML 로딩 중에 발생하는 오류를 처리하기 위해parseError를 사용할 수 있습니다.
parseError 속성은 실제로 다음 속성을 포함하는 개체입니다.
errorCode: 오류 유형 숫자 코드, 오류 없음은 0입니다.
filePos: 오류가 발생한 파일의 위치
line: line 오류가 발생한 위치 번호
linepos : 오류가 발생한 줄의 문자 위치
이유 : 오류에 대한 설명
srcText : 오류가 발생한 코드
url : 오류가 발생한 파일의 URL
5. 예시 :

코드 복사 코드는 다음과 같습니다. 🎜>
function createXMLDOM(){
var arrSignatures=["MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument", "Microsoft.XmlDom"];
for(var i= 0;itry{
var oXmlDom=new ActiveXObject(arrSignatures[i])
return oXmlDom;
} catch(oError){
}
}
throw new Error("MSXML이 시스템에 설치되지 않았습니다.")
}
var oXmlDom=createXMLDOM() ;
//방법 1: 문자열 로드
oXmlDom.loadXML("")
//오류 처리
if(oXmlDom .parseError != 0){
var oError=oXmlDom .parseError;
alert("오류가 발생했습니다:nError 코드:" oError.errorCode
"nLine:" oError.line "nLine Pos:" oError .linepos
"nReason:" oError.reason);
} else {
var childNodes=oXmlDom.documentElement.childNodes;
console.log(childNodes.length " " childNodes[0].xml );// 1
}
//방법 2: XML 파일 로드
oXmlDom.onreadystatechange = function(){
//문서 로드됨
if(oXmlDom .readyState == 4){
if(oXmlDom .parseError != 0){
var oError=oXmlDom.parseError;
alert("오류가 발생했습니다:n오류 코드:" oError.errorCode
"nLine:" oError.line "nLine Pos:" oError .linepos
"nReason:" oError.reason);
} else {
var childNodes=oXmlDom.documentElement.childNodes; log(childNodes.length " " childNodes[0].xml );// 1
}
}
}
oXmlDom.load("test.xml");



두 가지, Mozilla에서 XML DOM 지원

1. DOM 생성 DOM 표준은 document.implementation에 createDocument() 메서드가 있음을 나타냅니다. var oXmlDom=document.implementation.createDocument(""," ",null); 여기서 첫 번째 매개변수는 문서의 네임스페이스 URL, 문서 요소의 태그 이름 및 문서 유형 객체(항상 null입니다. 아직 Mozilla에서는 지원되지 않습니다.)
2. XML 로드
Mozilla는 XML 로드 방법 중 하나인 로드(파일 이름)만 지원합니다.
동기식과 비동기식은 비동기식으로 결정되며 기본값은 비동기식입니다.
XML 문자열인 경우 DOMParser 개체를 사용하여 DOM으로 변환합니다. 사용법은 다음과 같습니다.



코드 복사 코드는 다음과 같습니다. var oParser = new DOMParser();
var oXmlDom = oParser.parseFromString("","text/xml") ;


parseFromString 메소드의 첫 번째 매개변수는 XML 문자열이고 두 번째 매개변수는 콘텐츠 유형입니다. "text/xml" 또는 "application/xml"일 수 있습니다.
 3. XML 가져오기
Microsoft에서 제공하는 xml 기능은 표준이 아니므로 Mozilla는 XMLSerializer 개체를 지원하지 않습니다.



코드 복사 코드는 다음과 같습니다.

var oSerializer = new XMLSerializer();
var sXml = oSerializer.serializeToString(oXmlDom,"text/xml") 다음 예에서는 DefineGetter() 메서드를 사용하여 정의하는 방법을 볼 수 있습니다. XML 속성.

4. 파싱 오류
XML 파일을 파싱하는 과정에서 오류가 발생하면 XML DOM은 오류를 설명하는 문서를 생성합니다. 정규식은 오류 메시지를 출력하는 데 자주 사용됩니다.
코드 복사 코드는 다음과 같습니다.

var reError = / >([sS]*?)위치:([sS]*?)줄 번호 (d ), 열 (d ):([sS]*?)(?:-* ^)/;
if(oXmlDom.documentElement.tagName == "parsererror"){
reError.test(oXmlDom.xml)
alert("오류가 발생했습니다:nDescription: " RegExp.$1 " n"
"파일: " RegExp.$2 "n"
"Line: " RegExp.$3 "n"
"Line Pos: " RegExp.$4 "n"
"Source: " RegExp .$5);

5. 예시

코드 복사 다음은 다음과 같습니다.
var oXmlDom=document.implementation.createDocument("","",null)
oXmlDom.async =
oXmlDom.onload = 함수 (){
alert( '완료');
}
var reError = />([sS]*?)위치:([sS]*?)줄 번호 (d ),열 ( d ):( [sS]*?)(?:-*^)/
if(oXmlDom.documentElement.tagName == "parsererror"){
reError.test(oXmlDom.xml );
alert(" 오류가 발생했습니다:n설명: " RegExp.$1 "n"
"파일: " RegExp.$2 "n"
"줄: " RegExp.$3 "n"
"라인 위치: " RegExp.$4 "n"
"소스: " RegExp.$5)
}
Node.prototype.__defineGetter__("xml", function () {
var oSerializer = new XMLSerializer();
return oSerializer.serializeToString(this, "text/xml")
})
oXmlDom.load('test.xml'); );
var oNode = oXmlDom.documentElement.childNodes[1];
alert(oNode.xml)


다음은 IE 및 FireFox와 호환되는 일반 인터페이스입니다.


코드 복사
코드는 다음과 같습니다.

function XmlDom() {
if (window.ActiveXObject) {//IE
var arrSignatures = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0",
"MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", "Microsoft.XmlDom"];
for (var i = 0; i < arrSignatures.length; i ) {
try {
var oXmlDom = new ActiveXObject(arrSignatures[i]);
oXmlDom을 반환합니다.
}
catch (oError) {
//ignore
}
}
throw new Error("MSXML이 시스템에 설치되어 있지 않습니다.");
} else if (document.implementation && document.implementation.createDocument) {
var oXmlDom = document.implementation.createDocument("", "", null);
oXmlDom.parseError = {valueOf:function () {
return this.errorCode;
}, toString:function () {
return this.errorCode.toString();
}};
oXmlDom.__initError__();
oXmlDom.addEventListener("load", function () {
this.__checkForErrors__();
this.__changeReadyState__(4);
}, false);
oXmlDom을 반환합니다.
} else {
throw new Error("귀하의 브라우저는 XML DOM 개체를 지원하지 않습니다.");
}
}
if (isMoz) {
Document.prototype._readyState_ = 0;
Document.prototype.onreadystatechange = null;
Document.prototype.__changeReadyState__ = 함수(iReadyState) {
this._readyState_ = iReadyState;
if (typeof this.onreadystatechange == "function") {
this.onreadystatechange();
}
};
Document.prototype.__initError__ = function () {
this.parseError.errorCode = 0;
this.parseError.filepos = -1;
this.parseError.line = -1;
this.parseError.linepos = -1;
this.parseError.reason = null;
this.parseError.srcText = null;
this.parseError.url = null;
};
Document.prototype.__checkForErrors__ = function () {
if (this.documentElement.tagName == "parsererror") {
var reError = />([sS]*?)Location:([ sS]*?)줄 번호(d ), 열(d ):([sS]*?)(?:-*^)/;
reError.test(this.xml);
this.parseError.errorCode = -999999;
this.parseError.reason = RegExp.$1;
this.parseError.url = RegExp.$2;
this.parseError.line=parseInt(RegExp.$3);
this.parseError.linepos=parseInt(RegExp.$4);
this.parseError.srcText = RegExp.$5;
}
};
Document.prototype.loadXML = function (sXml) {
this.__initError__();
this.__changeReadyState__(1);
var oParser = new DOMParser();
var oXmlDom = oParser.parseFromString(sXml, "text/xml");
while (this.firstChild) {
this.removeChild(this.firstChild);
}
for (var i = 0; i < oXmlDom.childNodes.length; i ) {
var oNewNode = this.importNode(oXmlDom.childNodes[i], true);
this.appendChild(oNewNode);
}
this.__checkForErrors__();
this.__changeReadyState__(4);
};
Document.prototype.__load__ = Document.prototype.load;
Document.prototype.load = function (sURL) {
this.__initError__();
this.__changeReadyState__(1);
this.__load__(sURL);
};
Document.prototype.getReadyState = function () {
return this._readyState_;
};
Node.prototype.__defineGetter__("xml", function () {
var oSerializer = new XMLSerializer();
return oSerializer.serializeToString(this, "text/xml");
}) ;
}

四、其他浏览器
  本书中没有讲到其他浏览器,如现在很fire的Chrome,最新版的主浏览器现俯支持上面讲到的Mozilla方式。如果不支持,可以用AJAX来读取处理XML。
제작자 : Artwl
출처 : http://artwl.cnblogs.com
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.