DOMParserをネットで検索すると結構苦戦してる方が居るみたいなので、自分へのメモも兼ねて使い方を解説します。
ポイントは、値を文字列で渡すという点です。ActionscriptにあるXML()メソッドに使い方が似ていますので合わせて解説します。
XML()メソッドは、ストリングで、
var data:XML = new XML("<data>リンゴ</data><data>メロン</data>");
のように設定すると変数dataにXMLノードが格納されます。
拡張が必要ですが同じようにDOMParserでも、メソッドに値をストリングで設定するとXMLノードが取得できる仕組みです。以下のコードではparseFromStringというメソッドを拡張しString to XMLNodeを実現しています。
このコードの出典元サイト:erik.eae.net DOMParser
//DOMParser
if (typeof DOMParser == "undefined") {
DOMParser = function () {}
DOMParser.prototype.parseFromString =
function (str, contentType) {
if (typeof ActiveXObject != "undefined") {
var d = new ActiveXObject("MSXML.DomDocument");
d.loadXML(str);
return d;
} else if (typeof XMLHttpRequest != "undefined") {
var req = new XMLHttpRequest;
req.open("GET", "data:"
+ (contentType || "application/xml")
+ ";charset=utf-8,"
+ encodeURIComponent(str), false);
if (req.overrideMimeType) {
req.overrideMimeType(contentType);
}
req.send(null);
return req.responseXML;
}
}
}
使うときは以下のようにインスタンス化すると便利です。
//String to XML
var str = "<data>リンゴ</data><data>メロン</data>";
var contentType = "application/xml";
var _xml = new DOMParser();
var _xmlnodes = _xml.parseFromString(str, contentType);
ちなみに以下のようにするとHTMLデータを取得できます。こうするとinnerHTMLなどで書き出し作業を行わずにDOMの変更が行なえます。すなわちブラウザが重くなる事を避けることができます。
以下のコードを動かすにはHTML2XHTML Converterが必要です。
<html>
<head>
<title>DOMParser</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="HTML2XHTMLConverter.js"></script>
<script type="text/javascript">
if (typeof DOMParser == "undefined") {
DOMParser = function () {}
DOMParser.prototype.parseFromString = function (str, contentType) {
if (typeof ActiveXObject != "undefined") {
var d = new ActiveXObject("MSXML.DomDocument");
d.loadXML(str);
return d;
} else if (typeof XMLHttpRequest != "undefined") {
var req = new XMLHttpRequest;
req.open("GET", "data:" + (contentType || "application/xml") + ";charset=utf-8," + encodeURIComponent(str), false);
if (req.overrideMimeType) { req.overrideMimeType(contentType);}
req.send(null);
return req.responseXML;
}
}
}
try{
(function(output){
if ('undefined' !== typeof addEventListener) { addEventListener('load', output, false);
} else if ('undefined' !== typeof attachEvent) { attachEvent('onload', output);
} else { throw new Error('Error');
}
})(function(event){
function request(){
var dp = new DOMParser();//DOMParser create
var _xmlstr = '<div>Apple Orange <strong>Banana</strong></div>';
var xmlCode = dp.parseFromString(_xmlstr, 'application/xhtml+xml');
//DOM edit code
var code = get_xhtml(xmlCode, 'ja');//HTML2XHTML Converter
document.getElementById('xml').innerHTML = code//String data;
}
document.getElementById('results').onclick = request
});
}catch(e){alert(e.message);}
</script>
</head>
<body>
<button id="results">click</button>
<div id="xml"></div>
</body>
</html>
この記事を書き終えて見つけた記事です。
[JSAN] XML.ObjTree - XML~JavaScriptオブジェクト変換クラス
思わず「聞いてないよ~」が頭をよぎる。