Ajax로 ASP에서 개발을 할 때, JSON을 사용할 수 없기 때문에 XML을 사용해서 통신을 해야한다. XMLDOM이 브라우져별로 조금씩 다르게 동작하기 때문에 브라우져에서 공통적으로 사용할 수 있는 파서가 필요해 prototype.js를 확장해서 XMLParser를 만들었다.
XMLParser는 비동기적으로 여러개의 XML 파일을 다룰 수 있도록 별도 Class로 만들었고, list(id), get(node, id), toArray(id) function을 제공한다.
- list(id) : 지정된 아이디의 노드 배열을 리턴
- get(node, id) : 아이디가 있으면 해당 노드의 하위 노드 중에서 지정된 아이디의 노드의 값을 리턴, 아이디가 없으면 해당 노드의 값을 리턴
- toArray(id) : 지정된 아이디의 노드 값을 배열로 리턴
[prototype.js에 추가되는 코드]
XMLParser = Class.create();
Object.extend(XMLParser.prototype, {
initialize: function(xmlObj) {
this.xmlObj = xmlObj;
this.root = xmlObj.documentElement;
},
list: function(value) {
var result = this.root.getElementsByTagName(value);
return result;
},
get: function (node, value) {
if(typeof value != 'undefined')
node = node.getElementsByTagName(value).item(0);
return this.text(node);
},
toArray: function(value) {
var list = this.list(value);
var nodeValues = new Array();
for (var i = 0; i < list.length; i++) {
nodeValues.push(this.get(list[i]));
}
return nodeValues;
},
text: function (node) {
if (typeof node.textContent != 'undefined') {
return node.textContent;
}
else if (typeof node.innerText != 'undefined') {
return node.innerText;
}
else if (typeof node.text != 'undefined') {
return node.text;
}
else {
switch (node.nodeType) {
case 3:
case 4:
return node.nodeValue;
break;
case 1:
case 11:
var innerText = '';
for (var i = 0; i < node.childNodes.length; i++)
{
innerText += text(node.childNodes[i]);
}
return innerText;
break;
default:
return '';
}
}
}
});
XMLParser.nodeType = [
"",
"ELEMENT_NODE", // 1
"ATTRIBUTE_NODE", // 2
"TEXT_NODE", // 3
"CDATA_SECTION_NODE", // 4
"ENTITY_REFERENCE_NODE", // 5
"ENTITY_NODE", // 6
"PROCESSING_INSTRUCTION_NODE", // 7
"COMMENT_NODE", // 8
"DOCUMENT_NODE", // 9
"DOCUMENT_TYPE_NODE", // 10
"DOCUMENT_FRAGMENT_NODE", // 11
"NOTATION_NODE" // 12
];
[사용법]
<script language="javascript" type="text/javascript">
var xmlParser = new XMLParser(originalRequest.responseXML);
var items = xmlParser.list('item');
for (var i = 0; i < items.length; i++) {
var id = xmlParser.get(items[i], 'id');
var name = xmlParser.get(items[i], 'name');
$('result').value += id + ', ' + name + '\r\n';
}
var names = xmlParser.list('name');
for (var i = 0; i < names.length; i++) {
$('result').value += xmlParser.get(names[i]) + '\r\n';
}
var ids = xmlParser.toArray('id');
for (var i = 0; i < ids.length; i++) {
$('result').value += 'id:' + ids[i] + '\r\n';
}
</script>
<textarea id="result" cols="60" rows="10" ></textarea>
[예제 XML]
<?xml version="1.0" encoding='euc-kr'?>
<list>
<item>
<id>1</id>
<name>보드1</name>
</item>
<item>
<id>2</id>
<name>보드2</name>
</item>
<item>
<id>3</id>
<name>보드3</name>
</item>
</list>
현재 IE6.0, FF1.5에서 테스트되었다.
2 Comments
Prototype 개발자에게 Patch 를 보내보는것이 어떻겠습니까? 좋군요. ^^;
prototype 자체가 확장이 쉽게 만들어져 있습니다. 자유롭게 확장/변형해서 사용할 수 있는게 open source의 장점이죠. ^^
그리고 가능하면 JSON을 사용하는게 더 가볍고 직관적으로 사용하기 편합니다.