Avatar billede fuxi Nybegynder
10. maj 2006 - 14:27 Der er 12 kommentarer

XML I Javascript igen igen

Jeg har stadig problemer med noget XML. Helt konkret 2 problemer:
1. I Firefox kommer der dobbelt resultater ud i det jeg prøver at udskrive min XML som en tabel, prøv at kig på http://www.noproblem.dk/xml/show_result.html i IE og Firefox
2. Jeg kan ikke få min fjern agency til at virke, den fjerner noget man den fjerner ikke det hele og ikke det den skal

Min XML kan ses på http://www.noproblem.dk/xml/result.xml

Koden ses her:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
        <title>Test af findrejsen.dk</title>
        <script language="JavaScript">
            //<![CDATA[
            var xmlDoc = null;
            var oXmlHttp = null;
           
            // Get element by id
            function el(id)
            {
                  return document.getElementById(id);
            }
       
            // Create instance of xmlHttp
            function createXmlHttp()
            {
                if(typeof XMLHttpRequest != "undefined")
                {
                    return new XMLHttpRequest();
                }
                else if(window.ActiveXObject)
                {
                    var aVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp"];
                    for(var i=0; i<aVersions.length; i++)
                    {   
                          try { return new ActiveXObject(aVersions[i]); } catch(oError) { }
                    }
                  }
                throw new Error("XMLHttp object could not be created");
            }
               
            // Get data state change
            function getDataStateChange(func)
            {
                if (oXmlHttp.readyState==4)
                {
                    if (oXmlHttp.status==200)
                    {
                        func(oXmlHttp);
                    }
                }
            }
           
            // Load data
            function load(url,resultFunction)
            {
                if (!oXmlHttp)
                {
                    oXmlHttp = createXmlHttp();
                }
                else if (oXmlHttp.readyState != 0)
                {
                    oXmlHttp.abort();
                }
                oXmlHttp.open("GET",url,true)
                oXmlHttp.onreadystatechange=function() { getDataStateChange(resultFunction);  }
                oXmlHttp.send(null);
            }   
           
            function test()
            {
                xmlDoc = oXmlHttp.responseXML;
                showXML(xmlDoc);
            }
           
            // Remove agency
            function removeAgency(agencyId)
            {
                var agencyName, agencyId, flightCompany, priceTotal, outDepartureDateTime, outArrivalDateTime;
                var homeDepartureDateTime, homeArrivalDateTime, flightNumberOut, flightNumberHome, departureIata, departureName
                var destinationIata, destinationName, bookingUrl, priceTotal, pricePerson, currency
                var nodes, len, newXmlDoc, removeFlight;
               
                removeFlight = false;
                nodes = xmlDoc.documentElement.childNodes;

                len = nodes.length;
               
                for (i=0; i<len; i++)
                {
                    for (ii=0; ii<nodes.item(i).childNodes.length; ii++)
                    {
                        nodeText = nodes.item(i).childNodes[ii].text;
                        if (nodes.item(i).childNodes[ii].tagName == "agency_id")
                        {
                            if (nodeText == agencyId)
                            {
                                removeFlight = true;
                            }
                        }
                    }
                   
                    if (removeFlight)
                    {
                        for (ii=0; ii<nodes.item(i).childNodes.length; ii++)
                        {
                            removeFlight = false;
                            nodes.item(i).removeChild(nodes.item(i).childNodes[ii]);
                        }
                    }
                }
                showXML(xmlDoc);
            }
           
            // Get inner text
            function getInnerText(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;
                }
            }           
                       
            // Show the xml document as html
            function showXML(xmlDoc)
            {
                var agencyName, agencyId, flightCompany, priceTotal, outDepartureDateTime, outArrivalDateTime;
                var homeDepartureDateTime, homeArrivalDateTime, flightNumberOut, flightNumberHome, departureIata, departureName
                var destinationIata, destinationName, bookingUrl, priceTotal, pricePerson, currency
                var html,nodes,len;
               
                nodes = xmlDoc.documentElement.childNodes;
                len = nodes.length;
                html = '<table border="1">';
               
                for (i=0; i<len; i++)
                {
                    for (ii=0; ii<nodes.item(i).childNodes.length; ii++)
                    {
                        nodeText = getInnerText(nodes.item(i).childNodes[ii]);
                        switch(nodes.item(i).childNodes[ii].tagName)
                        {
                            case 'agency_name':
                                agencyName = nodeText;
                                break;
                            case 'agency_id':
                                agencyId = nodeText;
                                break;
                            case 'flight_company':
                                flightCompany = nodeText;
                                break;
                            case 'out_departure_date_time':
                                outDepartureDateTime = nodeText;
                                break;
                            case 'out_arrival_date_time':
                                outArrivalDateTime = nodeText;
                                break;
                            case 'home_departure_date_time':
                                homeDepartureDateTime = nodeText;
                                break;
                            case 'home_arrival_date_time':
                                homeArrivalDateTime = nodeText;
                                break;
                            case 'flight_number_out':
                                flightNumberOut = nodeText;
                                break;
                            case 'flight_number_home':
                                flightNumberHome = nodeText;
                                break;
                            case 'departure_iata':
                                departureIata = nodeText;
                                break;
                            case 'departure_name':
                                departureName = nodeText;
                                break;
                            case 'destination_iata':
                                destinationIata = nodeText;
                                break;
                            case 'destination_name':
                                destinationName = nodeText;
                                break;
                            case 'booking_url':
                                bookingUrl = nodeText;
                                break;
                            case 'price_total':
                                priceTotal = nodeText;
                                break;
                            case 'price_person':
                                pricePerson = nodeText;
                                break;
                            case 'currency':
                                currency = nodeText;
                                break;
                        }
                    }
                    html += "<tr>";
                    html += "<td>" + agencyName + "</td>";
                    html += "<td>" + agencyId + "</td>";
                    html += "<td>" + flightCompany + "</td>";
                    html += "<td>" + priceTotal + "</td>";
                    html += "<td>" + outDepartureDateTime + "</td>";
                    html += "<td>" + outArrivalDateTime + "</td>";
                    html += "<td>" + homeDepartureDateTime + "</td>";
                    html += "<td>" + homeArrivalDateTime + "</td>";
                    html += "<td>" + flightNumberOut + "</td>";
                    html += "<td>" + flightNumberHome + "</td>";
                    html += "<td>" + departureIata + "</td>";
                    html += "<td>" + departureName + "</td>";
                    html += "<td>" + destinationIata + "</td>";
                    html += "<td>" + destinationName + "</td>";
                    html += "<td>" + bookingUrl + "</td>";
                    html += "<td>" + priceTotal + "</td>";
                    html += "<td>" + pricePerson + "</td>";
                    html += "<td>" + currency + "</td>";
                    html += "</tr>";
                }
                html += "</table>";
                el('searchResult').innerHTML = html;
            }
           

            //]]>
        </script>
    </head>
    <body onload="load('http://www.noproblem.dk/xml/result.xml',test);">
        <a href="java script:removeAgency(2);">Remove agency</a><br/>
        <div id="searchResult"></div>
    </body>
</html>


Jeg håber at der er en der kan give mig et virkende eksempel, jeg har kæmpet med dette skidt det meste af dagen.
Avatar billede olebole Juniormester
10. maj 2006 - 17:31 #1
<ole>

Den måde kan du ikke scripte på under XHTML. Property'en 'innerHTML' findes ikke under XML-DOM'en - og enhver browser, der holder sig til XML- og XHTML-standarderne, vil derfor gå ned med en XML-fejl  :)

Faktisk har innerHTML aldrig været en del af nogen standard. Det er en proprietær property, MS indførte i IE3's HTML-DOM. Sidenhen fulgte de andre browsere trop, da der ikke var andre muligheder for at indsætte elementer.
Da W3C indførte den officielle DOM, fandt de ingen anledning til at optage innerHTML, da 'streng-tanken' er i direkte modstrid med DOM-tanken, hvor alt er noder ... så den bliver aldrig valid.

Dette er heller ikke XML-DOM:
    nodes.item(i).childNodes[ii].tagName

- og 'innerText' er heller ikke XML-DOM - og endda MS-only.

Dit umiddelbare problem opstår formodentlig i linjen:
    nodes = xmlDoc.documentElement.childNodes;

- hvor FF også medregner white-space noder. Prøv i stedet med document.getElementsByTagName.

/mvh
</bole>
Avatar billede olebole Juniormester
10. maj 2006 - 17:34 #2
Derudover kan du ikke bruge CSS i IE med den kode, du bruger. Din XML-deklaration disabler de vigtigste områder af CSS.
Den fejl bliver godtnok rettet i IE7 - men det betyder dog ikke, at IE7 vil understøtte XHTML ... det kommer den ikke til.

Det vil vare årevis, før du kan bruge XHTML til noget fornuftigt på WWW. Det er stadigvæk kun en eksperimentel standard med elendig understøttelse  ;o)
Avatar billede olebole Juniormester
10. maj 2006 - 17:38 #3
- og sålænge du udkommenterer din CDATA-escaping, vil ingen browser parse siden som XHTML ... den bliver parsed som tilfældig HTML-soup:

//<![CDATA[
...
...
...
//]]>

- det er helt misforstået  :)
Avatar billede fuxi Nybegynder
10. maj 2006 - 18:16 #4
Det er meget muligt at jeg ikke kan køre XHTML på den måde... Uanset hvad så er der jo ikke noget af det du skriver der løser mit problem!!!
Avatar billede olebole Juniormester
10. maj 2006 - 18:27 #5
- så er det nok fordi, du ikke læser, hvad jeg skriver  ;o)
Jeg prøver lige igen:

Dit umiddelbare problem opstår formodentlig i linjen:
    nodes = xmlDoc.documentElement.childNodes;

- hvor FF også medregner white-space noder. Prøv i stedet med document.getElementsByTagName.
Avatar billede olebole Juniormester
10. maj 2006 - 18:28 #6
- og så er det jo ikke ligegyldigt, om du kan skrive XHTML på denne måde eller ej. Der er vel en grund til, du skriver XHTML - og så er det da ikke fedt at skrive en kode, der vil få enhver XHTML-browser til at gå ned ... eller?  =)
Avatar billede fuxi Nybegynder
10. maj 2006 - 19:42 #7
oki sorry Ole, jeg læste den vist ikke rigtig ;O)
Dog vil jeg lige påpege at
//<![CDATA[
...
...
...
//]]>

Er anbefalet flere steder som måden at få JavaScript til at virke i XHTML f.eks. http://developer.mozilla.org/en/docs/Properly_Using_CSS_and_JavaScript_in_XHTML_Documents

Men igen mange tak for din kommentar, på trods af at jeg ikke lige læste den rigtig fra starten :)
Avatar billede olebole Juniormester
10. maj 2006 - 19:50 #8
Nej, det er ikke korrekt  :)

Det er anbefalet til, når XHTML-kode skal parses af en HTML-parser ... altså parses som HTML. Men jeg går da udfra, du har en mening med at skrive XHTML - og at den ikke er, at dokumentet skal parses som dårlig HTML-soup.

Sådan skal det se ud under XHTML (ellers dør browseren, hvis den forsøger at parse som XHTML):

<![CDATA[
...
...
...
]]>

- men det får alle HTML-browsere til at dø  :)

En anden ting: Server du overhovedet dit dokument korrekt? Jeg tvivler  =)

Prøv at læse disse to artikler, da XHTML er frygtelig meget mere end blot at koden validerer:
    http://www.eksperten.dk/artikler/537
    http://www.eksperten.dk/artikler/538
Avatar billede fuxi Nybegynder
10. maj 2006 - 20:03 #9
Tanken med at lave det i XHTML er at sikre at jeg kan læse siden på Mobilenheder... Men også meget meget gerne i almindelige browsere. Måske er løsningen i virkeligheden at laven en detection på browseren, så kan jeg jo vurdere om det er en mobilenhed ud fra det.
Avatar billede fuxi Nybegynder
10. maj 2006 - 20:19 #10
Jeg vil tro at det er tvivlsomt om serveren levere det rigtige format... heldigvis vil jeg relativt nemt kunne få det til at fungere ved at sætte min "Content-type: application/xhtml+xml" via ASP eller .NET

Jeg siger mange tak for hjælpen, det har været meget givtigt og jeg har opdaget en del ting om XHTML som jeg ikke i forvejen vidste.
Avatar billede olebole Juniormester
10. maj 2006 - 22:06 #11
Ja, men MIME-typen er kun en begyndelse. Koden bør jo være væsentlig forskellig i den ene browser, der i nogenlunde grad kan bruge XHTML - og så de andre  :)
Avatar billede fuxi Nybegynder
11. maj 2006 - 08:23 #12
Det er sandt.. .jeg syntes det er et par gode artikler du har skrevet..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester