Avatar billede fuxi Nybegynder
10. maj 2006 - 10:04 Der er 13 kommentarer

Fjern noder fra XML dokument

Hmm jeg har et problem, jeg vil fjerne en node og dens subnoder fra et XML dokument men kan ikke få det til at virke....

Det nemmeste er nok at se koden og kommentaren i koden...

Først min funktion til der gerne skulle finde frem til den node jeg vil fjerne (plus dens subnoder)

// 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)
        {
            // Slet min flight node med subnoder her!!!
        }
    }
   
    showXML(xmlDoc);
}


Her kommer lige mit XML dokument:

<?xml version="1.0" encoding="UTF-8"?>
<flights>
    <flight>
        <agency_name>Supersaver</agency_name>
        <agency_id>1</agency_id>
        <flight_company>KLM</flight_company>
        <out_departure_date_time>2006-05-12 10:00:00</out_departure_date_time>
        <out_arrival_date_time>2006-05-12 11:15:00</out_arrival_date_time>
        <home_departure_date_time>2006-05-12 11:45:00</home_departure_date_time>
        <home_arrival_date_time>2006-05-12 13:00:00</home_arrival_date_time>
        <flight_number_out>KLM2123</flight_number_out>
        <flight_number_home>KLM2223</flight_number_home>
        <departure_iata>BLL</departure_iata>
        <departure_name>Billund</departure_name>
        <destination_iata>LON</destination_iata>
        <destination_name>London</destination_name>
        <booking_url>http://www.supersaver.dk</booking_url>
        <price_total>2478</price_total>
        <price_person>1239</price_person>
        <currency>DKK</currency>
    </flight>
    <flight>
        <agency_name>Seat24</agency_name>
        <agency_id>2</agency_id>
        <flight_company>KLM</flight_company>
        <out_departure_date_time>2006-05-12 10:00:00</out_departure_date_time>
        <out_arrival_date_time>2006-05-12 11:15:00</out_arrival_date_time>
        <home_departure_date_time>2006-05-12 11:45:00</home_departure_date_time>
        <home_arrival_date_time>2006-05-12 13:00:00</home_arrival_date_time>
        <flight_number_out>KLM2123</flight_number_out>
        <flight_number_home>KLM2223</flight_number_home>
        <departure_iata>BLL</departure_iata>
        <departure_name>Billund</departure_name>
        <destination_iata>LON</destination_iata>
        <destination_name>London</destination_name>
        <booking_url>http://www.seat24.dk</booking_url>
        <price_total>2500</price_total>
        <price_person>1250</price_person>
        <currency>DKK</currency>
    </flight>
</flights>


Jeg formoder at det er noget med removeChild men jeg er gået kold i hvordan...
Avatar billede fuxi Nybegynder
10. maj 2006 - 10:05 #1
Lige som kommentar, så er xmlDoc mit xml dokument lavet ud fra følgende:
xmlDoc = oXmlHttp.responseXML;

showXML er en funktion der viser min XML kode som en tabel.
Avatar billede barklund Nybegynder
10. maj 2006 - 10:09 #2
Tror det laves pænest med:

    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)
                {
                    nodes.item(i).removeNode(true);
                    break;
                }
            }
        }
    }

:)

--
Morten Barklund
Avatar billede barklund Nybegynder
10. maj 2006 - 10:11 #3
Dog, med XPath havde det krævet knap så mange løkker, men kunne laves meget enkelt :)

var nodes_to_delete = selectNodes(nodes, "/flight[/agency_id/text() = '"+agency+"']");

Og så en løkke til at slette.

Det er lidt pænere :)

--
Morten Barklund
Avatar billede fuxi Nybegynder
10. maj 2006 - 10:33 #4
hmm den kommer med en fejl i linien nodes.item(i).removeNode(true);
Avatar billede fuxi Nybegynder
10. maj 2006 - 10:35 #5
Der kommer en Object does not support this method
Avatar billede barklund Nybegynder
10. maj 2006 - 10:57 #6
Efter at have faret lidt vild på msdn ser det ud til, at det hedder removeChild og skal bruges som:

                    nodes.removeChild(nodes.item(i));
                    break;

:)

--
Morten Barklund
Avatar billede fuxi Nybegynder
10. maj 2006 - 11:07 #7
Hmm det virker stadig ikke af en eller anden dum årsag.. .Underligt, jeg har søgt som en gal men finder ikke svarene...
Avatar billede fuxi Nybegynder
10. maj 2006 - 11:07 #8
Jeg prøver lige at smide hele min kode:

<?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;
                xmlDocShow = xmlDoc;
                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)
                            {
                                nodes.removeChild(nodes.item(i));
                                break;
                            }
                        }
                    }
                }
               
                showXML(xmlDoc);
            }
           
           
            // 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 = nodes.item(i).childNodes[ii].text;
                        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://tmvjweb2/peter/xslt/result.xml',test);">
        <a href="java script:removeAgency(2);">Remove agency</a><br/>
        <div id="searchResult"></div>
    </body>
</html>
Avatar billede fuxi Nybegynder
10. maj 2006 - 11:08 #9
http://tmvjweb2/peter/xslt/result.xml kan ikke kaldes ude fra... Men indeholder de data jeg smed i mit spørgsmål
Avatar billede fuxi Nybegynder
10. maj 2006 - 11:09 #10
Jeg har lige prøvet at teste i Firefox, der kommer der til at stå undefined i alle mine celler i tabellen...
Er der nogen der har en ide hvorfor?
Avatar billede barklund Nybegynder
10. maj 2006 - 11:26 #11
Niks :)
Avatar billede fuxi Nybegynder
10. maj 2006 - 13:25 #12
Jeg fandt ud af hvad man skal gøre for at få Firefox til at blive glad.... nedenstående funktion skal bruges i forbindelse med udtræk af en nodes indhold.

// 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;
    }
}   


Det vil sige at
nodeText = nodes.item(i).childNodes[ii].text;
bliver til
nodeText = getInnerText(nodes.item(i).childNodes[ii]);
Avatar billede olebole Juniormester
10. maj 2006 - 17:46 #13
<ole>

Sådan kan man ikke scripte under XHTML. Den eneste grund til, browseren ikke går ned med et hult drøn og en XML-fejl, er, at dokumentet behandles som tilfældig HTML ... ikke XHTML. Læs kommentaren:
    http://www.eksperten.dk/spm/708453#rid6252897

/mvh
</bole>
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