ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript 高度なプログラミング読書ノート (21) XML_javascript JavaScript のスキル

JavaScript 高度なプログラミング読書ノート (21) XML_javascript 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 の読み込みには次の 2 種類があります。
XML 文字列の読み込み:loadXML(xml string)
XML ファイルの読み込み:load (xml ファイル パス)。デフォルトでは、ファイルの読み込みは非同期です。これを同期に変更したい場合は、非同期機能を true に変更するだけです。ファイルを非同期でロードする場合は、readyState および onreadystatechange イベント ハンドラーが使用されます。 readState には次の 5 つの値があります。
0 - DOM は情報を初期化していません。
2 - DOM はデータの読み込みを完了しています。
3 - DOM は使用可能です。一部のパーツはまだ利用できない可能性があります。
4——DOM は完全にロードされており、使用できます。
3. XML の取得
Microsoft は各ノードに XML 機能を追加したため、XML を取得するのが非常に便利です。以下の例を参照してください。
4. 説明エラー
parseError を使用して、XML のロード中に発生するエラーを処理できます。
parseError プロパティは、実際には次のプロパティを含むオブジェクトです:
errorCode: エラーの種類は数値コード、エラーなしは 0
filePos: エラーが発生したファイル内の場所
line: 行エラーが発生した場所 番号
linepos: エラーが発生した行の文字の位置
reason: エラーの説明
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]); oXmlDom;
} catch(oError){
}
}
throw new Error("MSXML がシステムにインストールされていません");
var oXmlDom=createXMLDOM() ;
//方法 1: 文字列を読み込みます
oXmlDom.loadXML(""); .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;
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);
var childNodes=oXmlDom.documentElement.childNodes; log(childNodes.length " " childNodes[0].xml );// 1
}
}
}
oXmlDom.load("test.xml");



two 、Mozilla での XML DOM サポート

1. DOM の作成
DOM 標準では、 document.implementation に createDocument() メソッドがあることが指摘されています。
var oXmlDom=d​​ocument.implementation.createDocument(""," ",null); ここで、最初のパラメータはドキュメントの名前空間 URL、ドキュメント要素のタグ名、およびドキュメント タイプ オブジェクトです (常に null です)。 Mozilla ではまだサポートされていません)。
2. XML のロード
Mozilla は、XML をロードする 1 つの方法、load (ファイル名) のみをサポートします。 同期か非同期かは async で決まり、デフォルトは非同期です。 XML 文字列の場合は、DOMParser オブジェクトを使用して DOM に変換します。使用方法は次のとおりです。




コード


コードは次のとおりです:
var oParser = new DOMParser(); var oXmlDom = oParser.parseFromString("","text/xml") ; parseFromString メソッドの最初のパラメータは XML 文字列で、2 番目のパラメータはコンテンツ タイプです。 「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("エラーが発生しました:n説明: " RegExp.$1 " n"
"ファイル: " RegExp.$2 "n"
"行: " RegExp.$3 "n"
"行位置: " RegExp.$4 "n"
"ソース: " RegExp .$5);
}

5. 例

var oXmlDom=d​​ocument.implementation.createDocument("","",null);
oXmlDom.async = false;
oXmlDom.onload = function (){
alert( 'Done');
}
var reError = />([sS]*?)Location:([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];



3. 一般的なインターフェイス以下は 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 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__ = function (iReadyState) {
this._readyState_ = iReadyState;
if (typeof this.onreadystatechange == "関数") {
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 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");
}) ;
}

四、その他浏览器
本书中不讲他他浏览器,如现在很火的Chrome,最新版的主流浏览器サポートされていない場合は、AJAX を使用して処理 XML を取得できます。
作者: Artwl
出所:http://artwl.cnblogs.com
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。