ASP를 위한 XMLParser (prototype.js 확장)

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에서 테스트되었다.

This entry was posted in Software & Developer and tagged , , . Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

2 Comments

  1. Posted 2006/02/11 at 4:57 pm | Permalink

    Prototype 개발자에게 Patch 를 보내보는것이 어떻겠습니까? 좋군요. ^^;

  2. Posted 2006/02/11 at 9:15 pm | Permalink

    prototype 자체가 확장이 쉽게 만들어져 있습니다. 자유롭게 확장/변형해서 사용할 수 있는게 open source의 장점이죠. ^^
    그리고 가능하면 JSON을 사용하는게 더 가볍고 직관적으로 사용하기 편합니다.

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>