HTML5
DOM
AJAX
HTML
Børre Stenseth
DOMParser >DOMAjax

DOMParser og AJAX

Hva

Vi bruker parseren i nettleseren til å parse egne filer som hentes via AJAX og opprette DOM-objekter som kan leses og manipuleres på samme måte som vi kan lese og manipulere elementer på en webside. Nedenfor finner du en demonstrasjon av HTML og SVG. XML-filer kan vi lese via AJAX og få dem ferdig parset som dom-objekter tilbake.

HTML

Vi henter en enkel web-side, htmlpage.html

Vi henter og behandler teksten og lager et document slik:

_getHTML

SVG

Vi henter en SVG-fil flagget.svg, og presenterer den i sin helhet som et element på siden.

Vi behandler fila og lager et document slik:

_getSVG

SVG2

Nå viser det seg at jQuery (best guess) parser svg-fila som XML, og vi kan forenkle koden slik:

_getSVG2

Feilhandtering

XML-filer kan betraktes spå samme måte som SVG-eksempelet over, men vi må i begge tilfellene ta høyde for at XML-strukturen ikke er riktig. Vi bruker en ren XML-fil til å se nærmere på dette. Vi kan angripe dette på to måter: Vi kan hente fila som XML og sjekke hva vi får tilbake, eller vi kan lese fila som text og ta oss av parsingen med DomParser selv. Det to eksemplene under demonstrerer dette. Vi bruker i begge tilfellene denne enkle fila:

_medlemmer.xml

og en versjon der vi har introdusert en feil i et element(medlam i stedet for medlem)

_xmedlemmer.xml

Lese som XML

Koden blir i dette tilfellet slik:

_doXML
function doXML(adresse){
$.ajax({
    url:adresse,
    dataType:"xml",
    success:function(data,status,xhr)
    {
        useXML(xhr.responseXML);
    },
    error:function(xhr,statusText,errorThrown)
    {
        //console.log("fail: ",statusText);
        //console.log("fail: ",errorThrown);
        var T=statusText+'<br/>'+errorThrown;
        document.getElementById("dumpxml").innerHTML
          =T.substring(0,100);
    }
    });
}
function useXML(xmldoc){
    var elt=document.getElementById("dumpxml");
    // clear it (for second call)
    elt.innerHTML="";
    var resT="";
    var path='//medlem/navn';
    var nodes=xmldoc.evaluate(path, xmldoc, null, 
                                XPathResult.ANY_TYPE, null);
    var result=nodes.iterateNext();
    var resT="";
    while(result){
        resT+=result.childNodes[0].nodeValue + "</br>";
        result=nodes.iterateNext();
    }            
    elt.innerHTML=resT;
}

Lese som text

Koden blir i dette tilfellet slik. Vi bruker den samme strategien som når vi hentet XML-strukturen som text i modulen DOMParser .

_doXML
function doXML2(adresse){
$.ajax({
    url:adresse,
    dataType:"text",
    success:function(data,status,xhr)
    {
        useXML2(xhr.responseText);
    },
    error:function(xhr,statusText,errorThrown)
    {
        var T=statusText+'<br/>'+errorThrown;
        document.getElementById("dumpxml2").innerHTML
          =T.substring(0,100);
    }
    });
}
function useXML2(Xmedlemmer){
   var dumpelt=document.getElementById("dumpxml2");
    dumpelt.innerHTML="";
    try{
        var parser = new DOMParser();
        var xmldoc = parser.parseFromString(Xmedlemmer, 
                                        "application/xml");
        var docelt=xmldoc.documentElement;
        // something wrong ?
        if(docelt.nodeName=="parsererror"){
            var T=docelt.firstChild.textContent;
            throw(T);
        }
        // it is ok
        var resT="";
        var path='//medlem/navn';
        var nodes=xmldoc.evaluate(path, xmldoc, null, 
                                XPathResult.ANY_TYPE, null);
        var result=nodes.iterateNext();
        var resT="";
        while(result){
            resT+=result.childNodes[0].nodeValue + "</br>";
            result=nodes.iterateNext();
        }            
        dumpelt.innerHTML=resT;
    }
    catch(T){
        T=T.replace(new RegExp('<', 'g'), '&lt;')
            .replace(new RegExp('>', 'g'), '&gt;');
        //console.log(docelt,T);
        dumpelt.innerHTML=T;
    }
}

[1]
Referanser
DOMParser >DOMAjax